という名前の新しい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
前もって感謝します。