1

という名前の新しいRパッケージを作成しているとしmyvalsます。

これをファイルに書きますzzz.r

.__COMMONS__. <- new.env(parent = emptyenv())
.__COMMONS__.$vals <- c('val1', 'val2', 'val3')

次に、この関数を file に記述した場合vals.r:

whatvals <- function() {
  return(.__COMMONS__.$vals)
}

パッケージをインストールして (たとえば、devtoolsパッケージを介して) ロードすると (つまり、library(myvals))、次のようにwhatvals()動作します。

[1] "val1" "val2" "val3"

しかし、別の関数を書くと:

isval <- function(val = .__COMMONS__.$vals) {
  match.arg(val)
}

私がそれを呼び出すと、オブジェクトが見つからないため機能しません。R.__COMMONS__.

valこれは、関数による仮パラメータの遅延評価によるものだと思いますmatch.arg

ソース コードを調べるmatch.argと、最初の行が興味深いことがわかりました。

if (missing(choices)) {
  formal.args <- formals(sys.function(sys.parent()))
  choices <- eval(formal.args[[deparse(substitute(arg))]])
}

そこで、2 つの質問があります。

  • 関数の仮パラメータ.__COMMONS__.渡されたときに環境を正しく評価する方法は?val isval
  • パッケージのグローバル変数を作成するより洗練された方法はありますか?R

前もって感謝します。

4

0 に答える 0