R lappy循环中的函数环境
所以我遇到了这个问题,这个问题与存在于不同环境中的变量有关,它让我非常困惑,因为它不符合我对函数如何寻找不同对象的理解 我的玩具示例非常简单:我有一个函数R lappy循环中的函数环境,r,function,lapply,environment,R,Function,Lapply,Environment,所以我遇到了这个问题,这个问题与存在于不同环境中的变量有关,它让我非常困惑,因为它不符合我对函数如何寻找不同对象的理解 我的玩具示例非常简单:我有一个函数foo接受一个参数jfoo存在于带有参数“i”的lappy循环的函数中。现在,i显然存在于lappy环境中(而不存在于全局环境中)。在lappy函数foo中调用时,将努力查找i并抛出错误: foo <- function(j){ message('foo env: exists(j) ', exists('j')) message('
foo
接受一个参数j
foo
存在于带有参数“i”的lappy
循环的函数中。现在,i
显然存在于lappy
环境中(而不存在于全局环境中)。在lappy函数foo
中调用时,将努力查找i
并抛出错误:
foo <- function(j){
message('foo env: exists(j) ', exists('j'))
message('foo env: exists(i) ', exists('i'))
i
}
env.g <- environment()
invisible(lapply(1, FUN = function(i){
message('global env: exists(i) ', exists('i', envir = env.g))
message('lapply env: exists(i) ', exists('i'))
message(' ')
j <- i + 1
foo(j)
}
))
#global env: exists(i) FALSE
#lapply env: exists(i) TRUE
#foo env: exists(j) TRUE
#foo env: exists(i) FALSE
#Error in foo(j) : object 'i' not found
因此,我之前的理解是,如果函数在自己的环境中看不到变量,它会转到上一个(在我的第一个示例中为
lappy
,在我的第二个示例中为global env.),直到找到它为止。然而,它显然没有进入上面的lappy
的外循环。。。为什么?我相信这是因为函数foo()
是在定义它的环境中计算的。在您的示例中,foo()
是在全局环境中定义的,因此i
不在范围内。如果在匿名函数中定义foo()
,则i
的计算结果似乎正确
env.g <- environment()
invisible(lapply(1, FUN = function(i){
message('global env: exists(i) ', exists('i', envir = env.g))
message('lapply env: exists(i) ', exists('i'))
message(' ')
j <- i + 1
foo <- function(j){
message('foo env: exists(j) ', exists('j'))
message('foo env: exists(i) ', exists('i'))
i
}
foo(j)
}
))
#global env: exists(i) FALSE
#lapply env: exists(i) TRUE
#foo env: exists(j) TRUE
#foo env: exists(i) TRUE
env.g有4种类型的环境与函数相关
运行时:
rm(i)
lapply(1, foo)
甚至:
rm(i)
lapply(1, function(x) {
i <- 42
foo(x)
})
rm(i)
lappy(1,函数(x){
我提出了一个好问题。关于?lappy
的唯一信息似乎是,“如果expr是一个函数调用,请注意对其求值位置的假设”。谢谢@RemkoDuursma的链接!
rm(i)
lapply(1, function(x) {
i <- 42
foo(x)
})