gpt4 book ai didi

r - R 中的环境,mapply 和 get

转载 作者:行者123 更新时间:2023-12-04 21:54:58 25 4
gpt4 key购买 nike

x<-2在全局环境中:

x <-2 
x
[1] 2

a是定义另一个 x 的函数在本地使用 get :

a<-function(){
x<-1
get("x")
}

此函数正确获取 x来自本地环境:

a()
[1] 1

现在让我们定义一个函数b如下所示,使用 mapplyget :

b<-function(){
x<-1
mapply(get,"x")
}

如果我调用 b , 似乎 mapply使 get不要先搜索功能环境。相反,它会尝试获取 x直接形成全局环境,如果x未在全局环境中定义,它给出错误消息:

b()
x
2
rm(x)
b()
Error in (function (x, pos = -1L, envir = as.environment(pos), mode = "any", :
object 'x' not found

解决方案是显式定义 envir=environment() .

c<-function(){
x<-1
mapply(get,"x", MoreArgs = list(envir=environment()))
}

c()
x
1

但我想知道这里到底发生了什么。什么是 mapply正在做? (为什么?这是预期的行为吗?)这种“陷阱”在其他 R 函数中是否常见?

最佳答案

问题是 get 会查看它调用的环境,但这里我们将 get 传递给 mapply 然后调用 getmapply 中的本地环境。如果在 mapply 本地环境中找不到 x,那么它会查看它的父环境,即 environment(mapply)(其中是定义 mapply 的词法环境,其中是基本命名空间环境);如果它也不存在,它会查看它的父级,即全局环境,即您的 R 工作区。

这是因为 R 使用词法范围,as opposed to dynamic scoping .

我们可以通过获取存在于 mapply 中的变量来显示这一点。

 x <- 2
b2<-function(){
x<-1
mapply(get, "USE.NAMES")
}
b2() # it finds USE.NAMES in mapply
## USE.NAMES
## TRUE

除了问题中显示的涉及 MoreArgs 的解决方法之外,这也有效,因为它会导致搜索在找不到 b 内的本地环境 映射。 (这只是为了说明正在发生的事情,在实际操作中,我们更喜欢问题中显示的解决方法。)

x <- 2
b3 <-function(){
x<-1
environment(mapply) <- environment()
mapply(get, "x")
}
b3()
## 1

已添加 扩展说明。另请注意,我们可以像这样查看环境链:

> debug(get)
> b()
debugging in: (function (x, pos = -1L, envir = as.environment(pos), mode = "any",
inherits = TRUE)
.Internal(get(x, envir, mode, inherits)))(dots[[1L]][[1L]])
debug: .Internal(get(x, envir, mode, inherits))
Browse[2]> envir
<environment: 0x0000000021ada818>
Browse[2]> ls(envir) ### this shows that envir is the local env in mapply
[1] "dots" "FUN" "MoreArgs" "SIMPLIFY" "USE.NAMES"
Browse[2]> parent.env(envir) ### the parent of envir is the base namespace env
<environment: namespace:base>
Browse[2]> parent.env(parent.env(envir)) ### and grandparent of envir is the global env
<environment: R_GlobalEnv>

因此,可能遵循的环境的祖先是这样的(其中箭头指向父级):

local environment within mapply --> environment(mapply) --> .GlobalEnv

其中 environment(mapply) 等于 asNamespace("base"),基本命名空间环境。

关于r - R 中的环境,mapply 和 get,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23086432/

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