以下是四个函数,后者包装了前者。
a <- 0
f1 <- function(expr) {
a1 <- 1
eval(expr)
}
f2 <- function(expr) {
a2 <- 2
f1(expr)
}
f3 <- function(expr) {
a3 <- 3
f2(expr)
}
f4 <- function(expr) {
a4 <- 4
f3(expr)
}
请按照以下实验步骤进行操作:
> f4(a)
0
这段代码看起来是没问题的。但是如果我们调用
f4(a4) 出现错误:Error in eval(expr) : object 'a4' not found
> f4(a3)
Error in eval(expr) : object 'a3' not found
...
> f2(a2)
Error in eval(expr) : object 'a2' not found
> f2(a1)
Error in eval(expr) : object 'a1' not found
> f1(a1)
Error in eval(expr) : object 'a1' not found
我检查每个函数体的本地环境和父级环境。
f3
的父级帧是f4
的本地环境,...,而f1
的父级是f2
的函数体。这种情况清楚吗?如何解决此问题以使函数调用允许后续函数(例如f3
)查找已定义的符号(例如a4
)?