4

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

2 回答 2

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
于 2013-09-05T13:47:29.577 回答
1

也许sys.nframe

sys.nframe() == 0L
#[1] TRUE

fun <- function() {
  sys.nframe() == 0L
}

fun()
#[1] FALSE
于 2013-09-05T13:47:22.750 回答