1

グローバル変数を持つパッケージを構築しています。コードは次のとおりです。

at <- NA 
get.at <- function() {
  if (is.na(at)) {
    at <<- 1
  }
  at
}

しかし、私が呼び出すとget.at()、エラーが発生します:

Error in get.at() : cannot change value of locked binding for 'at'

どうすればこの問題を解決できますか?

編集:

  1. atパッケージのロード後に環境が封印されているため、変更できませんでした。ただしget.at()、カスタム関数を呼び出し.onLoadたり、.onAttach正常に呼び出したりすることは可能です。

  2. @danielが言ったように、別の解決策は、内部環境に属する変数を作成することです。

4

1 に答える 1

1

を見てみてください?unlockBinding。値を変更する前に、まずパッケージ内のバインディングを開く必要があるかもしれません。これは、役立つかもしれない R のヘルプ ファイルの一部です。

e <- new.env()
assign("x", 1, envir = e)
get("x", envir = e)
lockBinding("x", e)
try(assign("x", 2, envir = e)) # error
unlockBinding("x", e)
assign("x", 2, envir = e)
get("x", envir = e)

編集:これが実際にパッケージで適切に機能するかどうかはわかりません。考えられる解決策の 1 つは、別の R ソース ファイルzzz.Rを作成し、そこに変数が存在する環境を作成し、そこに既定値を割り当てることです。 zzz.R:

.PkgEnv <- new.env()
assign("at",NA, envir = .PkgEnv)

そして、関心のある環境から常に変数にアクセスできるように、コードを変更できます。

get.at <- function(){
  if(is.na(get("at",envir=.PkgEnv))){
    assign("at",1,envir=.PkgEnv)
  }
  get("at",envir=.PkgEnv)
}

これが「Rコアチームの推奨方法」であるかどうかはわかりませんが、テストパッケージでテストしたところうまくいきました。

于 2013-02-09T08:18:40.613 に答える