8

我查看了 R 中的其他词汇范围问题,但找不到答案。考虑这段代码:

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

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

4

1 回答 1

10

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

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

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

于 2015-04-14T17:51:47.150 回答