我看过R中的其他词汇范围问题,我找不到答案.考虑以下代码:
f <- function(x) {
g <- function(y) {
y + z
}
z <- 4
x + g(x)
}
f(3)
Run Code Online (Sandbox Code Playgroud)
f(3)将回答10.我的问题是为什么?在g()代码中定义的点,z尚未赋值任何值.在什么时候g()创建的闭包?是否"向前看"功能体的其他部分?它是在g(x)评估时创建的吗?如果是这样,为什么?
jor*_*ran 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对参数的延迟评估的各个点的"等于" 时,我的语言有点松散.一旦值为3,x 将等于3必要的.)