如何解决在使用R函数的情况下,环境的父级父环境是否也是该环境的父级?
假设,我创建一个环境(E)的父母的父母环境(E2
怎么了?请参见下面可复制示例的最后一行,其中print(parent-parent
)产生
# [1] FALSE # I would expect a TRUE here!!
从文档?parent.env
如果遵循通过反复调用找到的附件链 来自任何环境的parent.env,最终一个到达空 环境emptyenv(),可能没有分配任何内容。
subfun0 <- function() {
e <- parent.frame()
attr(e,"name") <- "my_env"
assign("my_env",1,envir = parent.frame(),inherits = FALSE,immediate = TRUE)
return(NULL)
}
subsubfun <- function() {
print(" subsubfun")
print(" =========")
print(exists("my_env"))
print(exists("my_env",parent.frame()))
env <- parent.frame()
print(exists("my_env",parent.env(env)))
# print(parent.env(env)) # <environment: R_GlobalEnv>??
return(NULL)
}
subfun <- function() {
print(" subfun")
print(" ======")
print(exists("my_env"))
print(exists("my_env",parent.env(env)))
subsubfun()
return(NULL)
}
fun1 <- function() {
print("fun1")
print("====")
subfun0()
print(exists("my_env"))
print(exists("my_env",parent.env(env)))
subfun()
return(NULL)
}
fun1()
# [1] "fun1"
# [1] "===="
# [1] TRUE # OK
# [1] FALSE
# [1] FALSE
# [1] " subfun"
# [1] " ======"
# [1] FALSE
# [1] TRUE # OK
# [1] FALSE
# [1] " subsubfun"
# [1] " ========="
# [1] FALSE
# [1] FALSE
# [1] FALSE # I would expect a TRUE here!!
解决方法
问题在于您实际上是在全局环境中定义所有函数,因此它们的父级是全局环境。
如果在其他函数中定义函数,您将得到期望的结果。 看下面的例子。
(我还创建了一个打印所有父环境直到全局环境的函数)
env_genealogy <- function(env){
while(!identical(env,globalenv())){
env <- parent.env(env)
print(env)
}
}
fun1 <- function() {
subfun0 <- function() {
print(" subfun0")
print(" ======")
env_genealogy(environment())
e <- parent.frame()
attr(e,"name") <- "my_env"
assign("my_env",1,envir = parent.frame(),inherits = FALSE,immediate = TRUE)
return(NULL)
}
subfun <- function() {
subsubfun <- function() {
print(" subsubfun")
print(" =========")
env_genealogy(environment())
print(exists("my_env"))
print(exists("my_env",parent.frame()))
env <- parent.frame()
print(exists("my_env",parent.env(env)))
# print(parent.env(env)) # <environment: R_GlobalEnv>??
return(NULL)
}
print(" subfun")
print(" ======")
env_genealogy(environment())
print(exists("my_env"))
print(exists("my_env",parent.frame()))
env <- parent.frame()
print(exists("my_env",parent.env(env)))
subsubfun()
return(NULL)
}
print("fun1")
print("====")
env_genealogy(environment())
subfun0()
print(exists("my_env"))
print(exists("my_env",parent.frame()))
env <- parent.frame()
print(exists("my_env",parent.env(env)))
subfun()
return(NULL)
}
fun1()
[1] "fun1"
[1] "===="
<environment: R_GlobalEnv>
[1] " subfun0"
[1] " ======"
<environment: 0x000001b0e4b124d8>
<environment: R_GlobalEnv>
[1] TRUE
[1] FALSE
[1] FALSE
[1] " subfun"
[1] " ======"
<environment: 0x000001b0e4b124d8>
attr(,"name")
[1] "my_env"
<environment: R_GlobalEnv>
[1] TRUE
[1] TRUE
[1] FALSE
[1] " subsubfun"
[1] " ========="
<environment: 0x000001b0e552add0>
<environment: 0x000001b0e4b124d8>
attr(,"name")
[1] "my_env"
<environment: R_GlobalEnv>
[1] TRUE
[1] TRUE
[1] TRUE
NULL
有关更多详细信息,请查看here
举个简单的例子,您可以看一下:
a <- function(){
i
}
a()
> #> Error in a() : object "i" not found
b <- function(){
i <- 1
a()
}
b()
> #> Error in a() : object "i" not found
d <- function(){
i <<- 1
a()
}
d()
#> [1] 1
rm(i)
f <- function(){
g <- a
i <- 2
g()
}
f()
#> Error in g() : object "i" not found
h <- function(){
l <- function() i
i <- 2
l()
}
h()
#> [1] 2
致电a()
时会收到错误消息,因为未定义i
。
即使您在i
内定义b()
,也会由于b
的环境未与a
共享而得到相同的错误。这是你的情况。
d()
之所以有效,是因为我们使用i
将<<-
分配给了全局环境。
f()
不起作用:即使我们在g
中定义了f
,我们也复制了a
并复制了其父环境。
我们在h()
中得到了一个结果,因为l()
是在内部定义的。这是我在回答中向您展示的情况。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。