2

関数内で名前空間変数を割り当てるのに苦労しています。CRAN パッケージ "qcc" を使用したこの例を考えてみましょう: qcc()プロットを生成しますが、そのプロットの表示オプションは によって制御されqcc.options()ます。

グローバルで作業する場合、すべて問題ありません。

library(qcc)
qcc.options(bg.margin="red")        # sets margin background colour, i.e.
                                    # qcc:::.qcc.options$bg.margin is "red"
qcc(rnorm(100), type = "xbar.one")  # generates a plot with red margin

ただし、関数のローカル環境で作業しているqcc場合qcc.options、名前空間の使用方法が異なるようです。

foo <- function(x){
   qcc.options(bg.margin=x)
   qcc(rnorm(100), type = "xbar.one")
}

foo("green")  # generates a default plot with grey margins
4

2 に答える 2

4

これは醜いハックです:

foo <- function(x){
  old.qcc.options <- get(".qcc.options", asNamespace("qcc"))
  assign(".qcc.options", qcc.options(bg.margin=x), asNamespace("qcc"))
  res <- qcc(rnorm(100), type = "xbar.one")
  assign(".qcc.options", old.qcc.options, asNamespace("qcc"))
  invisible(res)
}

foo("green")

もちろん、スコープの問題は、 を変更することでより適切に解決できますqcc.options。それについては、パッケージのメンテナに連絡する必要があります。

于 2013-10-07T08:28:52.037 に答える
3

これは、その変数をどこにqcc.options格納するかによるものです。.qcc.optionsグローバルで作業すると、これはqcc:::.qcc.optionsですが、関数内にいるときは、 と呼ばれるローカル変数に格納され.qcc.optionsます。したがって、使用しようとするplot.qccと (によって呼び出されqccます)、グローバル (エクスポートされていない)qcc:::.qcc.optionsではなく、グローバルからオプションを取得します。ローカル.qcc.options

オプションで何が起こっているかを示す関数は次のとおりです。

bar <- function(x){
   pre <- qcc:::.qcc.options
   pre.marg <- qcc.options("bg.margin")
   qcc.options(bg.margin=x)
   post1 <- qcc:::.qcc.options
   post2 <- .qcc.options
   post.marg <- qcc.options("bg.margin")
   qcc(rnorm(100), type = "xbar.one")
   list(pre,post1,post2,pre.marg,post.marg)
}
bar('green')

結果を見ると、qcc.optionsがローカル変数を作成し、その値をbg.marginに変更することがわかります"green"が、これは後で によって参照されるオブジェクトではありませんplot.qcc

これはおそらく最適なセットアップではないため、パッケージのメンテナーにコードの変更を依頼する必要があるようです。

編集: 回避策はassignInNamespace、ローカル変数を使用してグローバル変数を上書きすることです。(明らかに、これはパラメーターをグローバルに変更し、パラメーターが更新されない限り、後続のすべてのプロットに影響します。)

foo <- function(x){
   qcc.options(bg.margin=x)
   assignInNamespace('.qcc.options',.qcc.options,ns='qcc')
   qcc(rnorm(100), type = "xbar.one")
}
foo('green')

ここに画像の説明を入力

于 2013-10-07T08:28:45.257 に答える