0

以下に定義されている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)") は扱いにくく、私が目指しているコードの整然としたものにはなりません。したがって、変数を親フレームからヘルパー関数に匿名で渡す必要があります。

4

1 に答える 1

2

代わりにこれを使用してください:

eval.here <- function(fun){
 fun <- get(fun)
 environment(fun) <- parent.frame()
 print(environment(fun))
 fun()
}

結果:

> testfun2(x = 2,y = 1:3)

<environment: 0x0000000013da47a8>
<environment: 0x0000000013da47a8>
$x
[1]  5  8 13

$xy
[1] 2 4 6
于 2013-09-18T19:08:53.203 に答える