理解对函数输入参数的评估

时间:2016-11-24 16:09:16

标签: r lazy-evaluation

我正在阅读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()中发生了什么。

感谢。

1 个答案:

答案 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