gpt4 book ai didi

r - lapply 循环内的函数环境

转载 作者:行者123 更新时间:2023-12-01 13:32:00 25 4
gpt4 key购买 nike

所以我遇到了这个与不同环境中存在的变量有关的问题,它让我非常困惑,因为它不符合我对函数如何查找各种对象的理解。

我的玩具示例非常简单:我有一个函数 foo提出一个论点 j . foo存在于 lapply 的函数中带有参数“i”的循环。现在,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 的外循环在上面...为什么?

最佳答案

我相信这是因为功能 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

关于r - lapply 循环内的函数环境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45564097/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com