以下に定義されているfunctiontestfun1
は、私がやりたいことを行います。(これらすべての理由については、コード例の下にある背景情報を参照してください。) 私があなたに聞きたかった質問は、私が試したことがなぜtestfun2
うまくいかないのかということです。私には、どちらもまったく同じことをしているように見えます。の出力で示されているように、testfun2
内部のヘルパー関数の評価はtestfun2
正しい環境で行われますが、メイン関数環境の変数は魔法のように のヘルパー関数に渡されますが、testfun1
では渡されませんtestfun2
。理由を知っている人はいますか?
helpfun <- function(){
x <- x^2 + y^2
}
testfun1 <- function(x,y){
xy <- x*y
environment(helpfun) <- sys.frame(sys.nframe())
x <- eval(as.call(c(as.symbol("helpfun"))))
return(list(x=x,xy=xy))
}
testfun1(x = 2,y = 1:3)
## works as intended
eval.here <- function(fun){
environment(fun) <- parent.frame()
print(environment(fun))
eval(as.call(c(as.symbol(fun))))
}
testfun2 <- function(x,y){
print(sys.frame(sys.nframe()))
xy <- x*y
x <- eval.here("helpfun")
return(list(x=x,xy=xy))
}
testfun2(x = 2,y = 1:3)
## helpfun can't find variable 'x' despite having the same environment as in testfun1...
背景情報: メイン関数内でヘルパー関数を呼び出したい大きな R コードがあります。これらは、メイン関数環境の変数を変更します。これらすべての目的は、主にコードを整理することです。(主な関数コードは現在 2000 行を超えており、さまざまなヘルパー関数への多くの呼び出しがあり、それ自体が 40 ~ 150 行の長さです...)
ヘルパー関数への引数の数が非常に多いことに注意してください。引数 ( " helpfun(arg1 = arg1, arg2 = arg2, ... , arg50 = arg50)
") は扱いにくく、私が目指しているコードの整然としたものにはなりません。したがって、変数を親フレームからヘルパー関数に匿名で渡す必要があります。