我看过R中的其他词汇范围问题而我找不到答案。请考虑以下代码:
f <- function(x) {
g <- function(y) {
y + z
}
z <- 4
x + g(x)
}
f(3)
f(3)
将返回10的答案。我的问题是为什么?在代码中定义g()
时,z
尚未分配任何值。在什么时候创建了g()
的闭包?是否“向前看”功能体的其他部分?它是在评估g(x)
时创建的吗?如果是这样,为什么?
答案 0 :(得分:10)
运行f
时,首先发生的是在g
的本地环境中创建函数f
。接下来,通过赋值创建变量z
。
最后,将x
添加到g(x)
的结果中并返回。在g(x)
被调用时,x = 3
和g
存在于f
的本地环境中。当在执行z
时遇到自由变量g(x)
时,R会在下一个环境中查找调用环境,即f
的本地环境。它会在那里找到z
并继续,然后返回7.然后将其添加到x
,即3。
(由于这个答案引起了更多的关注,我应该补充一点,当谈到x
“等于”可能无法准确反映R对参数的延迟评估的各个点时,我的语言有点松散。{一旦需要该值,<1}} 将等于3。)