私のR開発では、オブジェクトのメソッドが呼び出されたproto
ときに多数の引数を関数に自動的に渡すことができるように、関数プリミティブをオブジェクトにラップする必要があります。$perform()
関数の呼び出しは、内部で。を介して行われdo.call()
ます。関数が、それが定義されているクロージャから変数にアクセスしようとする場合を除いて、すべてが順調です。その場合、関数は名前を解決できません。
これは、動作を再現する私が見つけた最小の例です。
library(proto)
make_command <- function(operation) {
proto(
func = operation,
perform = function(., ...) {
func <- with(., func) # unbinds proto method
do.call(func, list(), envir=environment(operation))
}
)
}
test_case <- function() {
result <- 100
make_command(function() result)$perform()
}
# Will generate error:
# Error in function () : object 'result' not found
test_case()
再現性のあるtestthat
テストがあり、多くの診断出力も出力されます。診断出力は私を困惑させました。親環境チェーンを検索することにより、関数内にある私の診断コードは、関数が検出できないのとまったく同じ変数を検出して出力します。この要点を参照してください。。
do.call
の環境を正しく設定するにはどうすればよいですか?