関数を考えてみましょうfun1()
。それを呼び出すことはありません値を代入2
するxx
の中で.GlobalEnv
。
fun1 <- function(x) eval(expr=substitute(x))
fun1({xx <- 2; xx})
## [1] 2
xx
## Error: object 'xx' not found
引数のデフォルト値envir
のeval()
次のとおりです。
formals(eval)$envir
## parent.frame()
ではfun2()
引数envir
明示的にデフォルト値に設定されていますparent.frame()
。呼び出しfun2()
ん値を代入2
するxx
の中で.GlobalEnv
。
fun2 <- function(x) eval(expr=substitute(x), envir=parent.frame())
fun2({xx <- 2; xx})
## [1] 2
xx
## [1] 2
(Rバージョン3.5.0でテスト済み)
何故ですか?その動作は意図されていますか?
関数のデフォルトは、関数の評価フレームで評価されます。明示的な引数は、呼び出しフレームで評価されます。(これらは両方とも非標準の評価トリックによって変更できますが、使用していません。)
したがって、最初の例でparent.frame()
は、はへの呼び出しの親eval()
、つまりの評価フレームですfun1()
。2番目の例でparent.frame()
は、はへの呼び出しの親ですfun2()
。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加