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

Cel*_*dor 7 r lazy-evaluation

我正在阅读Hadley Wickham的Advanced R,其中提供了一些非常好的练习.其中一个要求描述这个功能:

f1 <- function(x = {y <- 1; 2}, y = 0) {
  x + y
}
f1()
Run Code Online (Sandbox Code Playgroud)

有人能帮我理解为什么它会返回3吗?我知道有一些叫做延迟评估输入参数的东西,例如另一个练习要求描述这个函数

f2 <- function(x = z) {
  z <- 100
  x
}
f2()
Run Code Online (Sandbox Code Playgroud)

我正确地预测为100; x获取z在函数内部计算的值,然后返回x.但我无法弄清楚会发生什么f1().

谢谢.

mt1*_*022 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.

  • 另外,我想,值得一提的是`y + x`而不是'x + y`返回不同的值(在`f1`的主体中) (5认同)