【发布时间】:2018-01-15 18:35:03
【问题描述】:
所以我遇到了这个与不同环境中存在的变量有关的问题,这让我非常困惑,因为它不符合我对函数如何查找各种对象的理解。
我的玩具示例非常简单:我有一个函数foo 接受一个参数j。 foo 存在于带有参数“i”的 lapply 循环的函数中。现在,i 显然存在于lapply 环境中(并且不存在于全局环境中)。当在 lapply 函数中调用 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
另一方面,当i 存在于全局环境中时,foo 可以接受:
i <- 10
foo()
#foo env: exists(j) TRUE
#foo env: exists(i) TRUE
#[1] 10
所以我之前的理解是,如果一个函数在它自己的环境中看不到变量,它会转到下一个变量(在我的第一个示例中为lapply,在我的第二个示例中为全局环境),直到找到它。但是,它显然没有去上面lapply的外循环......为什么?
【问题讨论】:
-
好问题。
?lapply上的唯一信息似乎是,“如果 expr 是一个函数调用,请注意关于它在何处被评估的假设”。 -
感谢@RemkoDuursma 的链接!
标签: r function lapply environment