我正在阅读Hadley Wickham的Advanced R,其中提供了一些非常好的练习。其中一个要求描述这个功能:
f1 <- function(x = {y <- 1; 2}, y = 0) {
x + y
}
f1()
有人可以帮我理解为什么它会返回3吗?我知道有一些叫做延迟评估输入参数的东西,例如另一个练习要求描述这个功能
f2 <- function(x = z) {
z <- 100
x
}
f2()
我正确地预测为100; x
获取在函数内部计算的z
的值,然后返回x。我无法弄清f1()
中发生了什么。
感谢。
答案 0 :(得分:8)
请参阅https://cran.r-project.org/doc/manuals/r-patched/R-lang.html#Evaluation:
当调用或调用函数时,新的评估框架是 创建。在这个框架中,形式参数与 根据参数匹配中给出的规则提供参数。 函数体中的语句按顺序进行评估 在这个环境框架中。 ... R有一种对函数参数进行惰性求值的形式。在需要之前不会评估参数。
这来自https://cran.r-project.org/doc/manuals/r-patched/R-lang.html#Arguments:
可以使用特殊表单指定参数的默认值 'name = expression'。在这种情况下,如果用户没有指定 函数调用表达式时参数的值 将与相应的符号相关联。当值是 需要表达式在评估框架中进行评估 功能
总之,如果参数没有用户指定的值,则会在函数的评估框中评估其默认值。因此,y
一开始并未进行评估。在功能评估框中评估默认值x
时,y
将修改为1,然后x
将设置为2.作为y
已经找到,默认参数没有要评估的更改。如果您尝试f1(y = 1)
和f1(y = 2)
,结果仍为3
。