检测环境是否为全球环境

时间:2013-09-05 13:27:41

标签: r

有时,检测环境是否是全球环境并采取相应措施可能会有所帮助。我提出了我认为是一种检测环境的方法,并测试它是否是全球环境。我只是不想重新发明轮子,如果有更好的方法,或者如果有漏洞等。是否有某种内置的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()

2 个答案:

答案 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