我仍然试图理解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
的行为方式不同?
答案 0 :(得分:3)
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)