R函数将未评估的参数传递给其他函数

时间:2013-08-05 00:58:02

标签: r lazy-evaluation

我仍然试图理解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的行为方式不同?

1 个答案:

答案 0 :(得分: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)