我仍在尝试理解 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"
为什么做g
和h
不做同样的事情?
我仍在尝试理解 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"
为什么做g
和h
不做同样的事情?
惰性评估方面R
是它在需要时才评估对象。但是,您所看到的与惰性评估无关。相反,它与省略号参数有关:
调用 时g(y)
,f
将 x 的值替换为省略号。但substitute(...)
本质上替换发送到省略号的值(在这种情况下,省略号的行为类似于[不完全] 到另一个调用替换)。
调用 时h(y)
,再次f
代入 的值 x
,它是椭圆以外的值,即z
,代入该值。
请查看以下内容并在您的环境中执行。
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)