我正在阅读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()
中会发生什么。谢谢。
最佳答案
从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:
可以使用特殊格式指定参数的默认值
“名称=表达式”。在这种情况下,如果用户未指定
调用函数时参数的值
将与相应的符号关联。当值是
需要在表达式的评估框中评估表达式
功能。
总之,如果参数没有用户指定的值,则将在函数的评估框架中评估其默认值。因此,首先不评估y
。在函数的评估框架中评估x
的默认值时,将y
修改为1,然后将x
设置为2。由于已经找到y
,因此默认参数没有变化。评估。如果您尝试f1(y = 1)
和f1(y = 2)
,结果仍然是3
。
关于r - 了解函数输入参数的评估,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40790797/