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)
})