para1 <- c( 1, 3, 5) para2 <- c( 7, 11, 13) parameter <- data.frame(para1, para2)
こんな感じでパラメータのリスト作っておいて
## case 1 fun <- lapply(parameter, function(x){ function(){ x[1] + x[2] + x[3] }})
こうやってパラメータが違うだけの関数のリストを作ろうとした.
> fun[[1]]() [1] 31 > fun[[2]]() [1] 31
上手く動かない…
ところが途中で一度引数を呼び出すと
## case 2 fun2 <- lapply(parameter, function(x){ hoge <- x ## <- ココ function(){ x[1] + x[2] + x[3] }})
> fun2[[1]]() [1] 9 > fun2[[2]]() [1] 31
上手く動く.スコープとかイマイチ理解してないんですがその辺の問題なんですかね.
追記:遅延評価が問題になってるらしい(syou6162 thx!)
一度呼び出すことでxが評価されるから?ということらしい.ただ気になるのは中身が同じに見えるということ
> fun $para1 function () { x[1] + x[2] + x[3] } <environment: 0x01c22e3c> $para2 function () { x[1] + x[2] + x[3] } <environment: 0x01c22d78> > fun2 $para1 function () { x[1] + x[2] + x[3] } <environment: 0x0455f850> $para2 function () { x[1] + x[2] + x[3] } <environment: 0x0455f71c>
fun2は評価前に見えるけど,ちゃんと動くんだから評価されてるってことなんだろう.これはそういう仕様なのか?
追記2: これはまだ評価されていません.サーチパス上に適切に評価されたオブジェクトが有るか否かが鍵です.cf.Rにおける遅延評価や環境,サーチパスのこと - もうカツ丼でいいよな