介绍
R函数在调用执行时, 除非用到某个形式变量的值才求出其对应实参的值
。 这一点在实参是常数时无所谓, 但是如果实参是表达式就不一样了。 形参缺省值也是只有在函数运行时用到该形参的值时才求值。
这个特点可以用下面的例子理解,比如行参的默认值不是常量而是一个表达式:
f <- function(x, y=ifelse(x>0, TRUE, FALSE)){
x <- -111
if(y) x*2 else x*10
}
f(5)
这时候的输出结果并不是,10,而是-1100。
这是因为形参y 并没按x=5 被赋值为TRUE, 而是到函数体中第二个语句才被求值, 这时x 的值已经变成了-111, 故y的值是FALSE。
也就是说,在懒惰求值的条件下,只有函数表达式中遇到了包含有某个行参,才会对其实参进行计算,而根据句法作用域的规则,x 在函数环境下已经被重新赋值了。
在函数内部, 用missing(x)
对形参x判断用户是否没有提供对应的实参, 对位置形参和有缺省值的形参都适用。
ps: 其判断用户是否没有提供对应的实参,如果提供了则为F,没有则是T。
> a = function(x=3,y) missing(x)
> a(1,3)
[1] FALSE
> a(x = 1,3)
[1] FALSE
> a(3)
[1] FALSE
> a(y=3)
[1] TRUE