考虑以下简单函数:
f <- function(x, value){print(x);print(substitute(value))}
参数x
最终将由 评估print
,但value
永远不会。所以我们可以得到这样的结果:
> f(a, a)
Error in print(x) : object 'a' not found
> f(3, a)
[1] 3
a
> f(1+1, 1+1)
[1] 2
1 + 1
> f(1+1, 1+"one")
[1] 2
1 + "one"
一切如预期。
现在考虑替换函数中的相同函数体:
'g<-' <- function(x, value){print(x);print(substitute(value))}
(单引号应该是花式引号)
让我们尝试一下:
> x <- 3
> g(x) <- 4
[1] 3
[1] 4
目前没有什么异常...
> g(x) <- a
Error: object 'a' not found
这是出乎意料的。名称a
应打印为语言对象。
> g(x) <- 1+1
[1] 4
1 + 1
这没关系,因为x
' 以前的值是4
。请注意未计算传递的表达式。
最终测试:
> g(x) <- 1+"one"
Error in 1 + "one" : non-numeric argument to binary operator
等一下……它为什么要尝试评估这个表达式?
那么问题是:错误还是功能?这里发生了什么?我希望一些 guru 用户能够对 R 的承诺和惰性评估有所了解。或者我们可能会得出结论,这是一个错误。