有时,检测环境是否是全球环境并采取相应措施可能会有所帮助。我提出了我认为是一种检测环境的方法,并测试它是否是全球环境。我只是不想重新发明轮子,如果有更好的方法,或者如果有漏洞等。是否有某种内置的R方法可以做global_test
下面做的或更好的方法?
global_test <- function() {
environmentName(parent.frame(n = 1)) == "R_GlobalEnv"
}
global_test()
lapply(1:10, function(i) {
global_test()
})
fun <- function() global_test()
fun()
答案 0 :(得分:11)
我会简化你的生活并使用identical
:
global_test <- function() {
identical( parent.frame(n = 1) , globalenv() )
}
我认为这比做字符比较要稍微“安全”,因为你可以这样做:
e <- new.env()
attr(e,"name") <- "R_GlobalEnv"
# And then...
environmentName(e)
#[1] "R_GlobalEnv"
正如@eddi指出的那样,使用.GlobalEnv
可能也不可取,因为可以这样做:
.GlobalEnv <- 1
identical( parent.frame(n = 1) , .GlobalEnv )
#[1] FALSE
identical
的这种使用实际上是?identical
上的帮助页面中的一个示例:
## even for unusual R objects :
identical(.GlobalEnv, environment())
所以即使我们试图欺骗R,该功能仍然有效:
e <- new.env()
attr(e,"name") <- "R_GlobalEnv"
.GlobalEnv <- 1
global_test()
#[1] TRUE
答案 1 :(得分:1)
也许sys.nframe
?
sys.nframe() == 0L
#[1] TRUE
fun <- function() {
sys.nframe() == 0L
}
fun()
#[1] FALSE