1

現在、eval 関数の動作を理解するのにいくつか問題があります。具体的には、引数が指定されていない場合の enclos/3 番目の引数/デフォルトの引数 parent.fame() が使用されています。

name <- function(x){
    print(substitute(x))
    t <- substitute(x)
    eval(t, list(a=7), parent.frame())
}
z <-5
name(a+z)
# returns 12, makes sense because this amounts to
# eval(a+z, list(a=7), glovalenv())


# however the return here makes no sense to me

  name2 <- function(x){
    print(substitute(x))
    t <- substitute(x)
    eval(t, list(a=7)) # third/enclosure argument is left missing
}

z <-5
name2(a+z)
# Also returns 12

2 番目の呼び出しが 12 を返す理由を理解するのに苦労しています。R に関する私の理解によれば、2 番目の呼び出しはエラーになるはずです。

1) eval のデフォルトの 3 番目の引数 enclos=parent.frame()。これは指定されていません。

2) したがって、parent.frame() は eval のローカル環境で評価されます。これは、デフォルトの引数のparent.frameはいつ/どのように/どこで解釈されますか? でHadleyによって確認されていますか?

3) したがって、最後の式は eval(a+z, list(a=7), running environment of name) に解決されるはずです

4) z は name の実行環境にも list(a=7) にも定義されていないため、エラーが返されます。

誰かがこのロジックの何が問題なのか説明してもらえますか?

4

1 に答える 1