4

我仍在尝试理解 R 中的惰性求值。这让我感到困惑:

f=function(x) as.character(substitute(x))
g=function(...) f(...)
h=function(z) f(z)

f(y)
# [1] "y"
g(y)
# [1] "y"
h(y)
# [1] "z"

为什么做gh不做同样的事情?

4

1 回答 1

3

惰性评估方面R是它在需要时才评估对象。但是,您所看到的与惰性评估无关。相反,它与省略号参数有关:

调用 时g(y)f将 x 的值替换为省略号。但substitute(...)本质上替换发送到省略号的值(在这种情况下,省略号的行为类似于[不完全] 到另一个调用替换)。

调用 时h(y),再次f代入 的值 x,它是椭圆以外的值,即z,代入该值。


根据@Alexander 的评论进行编辑:

请查看以下内容并在您的环境中执行。

f=function(x) {cat("\nHERE IS THE OUTPUT FOR `f`: "); as.character(substitute(x))}
g=function(...) {cat("I am evaluating the first argument", ..1, "\n"); f(...)}
h=function(z)  {print(z); f(z)}

y <- "Look, I am evaluated!\n"
f(y)
g(y)
h(y)
于 2013-08-05T01:29:11.663 回答