词汇范围何时确定函数内的函数?

时间:2015-04-14 17:44:34

标签: r lexical-scope

我看过R中的其他词汇范围问题而我找不到答案。请考虑以下代码:

f <- function(x) {
  g <- function(y) {
    y + z
  }
  z <- 4
  x + g(x)
}
f(3)

f(3)将返回10的答案。我的问题是为什么?在代码中定义g()时,z尚未分配任何值。在什么时候创建了g()的闭包?是否“向前看”功能体的其他部分?它是在评估g(x)时创建的吗?如果是这样,为什么?

1 个答案:

答案 0 :(得分:10)

运行f时,首先发生的是在g的本地环境中创建函数f。接下来,通过赋值创建变量z

最后,将x添加到g(x)的结果中并返回。在g(x)被调用时,x = 3g存在于f的本地环境中。当在执行z时遇到自由变量g(x)时,R会在下一个环境中查找调用环境,即f的本地环境。它会在那里找到z并继续,然后返回7.然后将其添加到x,即3。

(由于这个答案引起了更多的关注,我应该补充一点,当谈到x“等于”可能无法准确反映R对参数的延迟评估的各个点时,我的语言有点松散。{一旦需要该值,<1}} 等于3。)