2013-09-05 44 views
2

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

http://stackoverflow.com/questions/14491523/how-to-compare-environment-for-equality-in-r – Peyton

+0

起初我以为这是重复的,并投票结束,但该问题的答案不似乎做同样的事情。 –

回答

9

我将简化你的生活一点点,使用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

+1,但如果意外覆盖'.GlobalEnv'会怎么样? :) – eddi

+0

@eddi true。也许'globalenv()'会更安全。我会更新。 –

1

也许sys.nframe

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

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

fun() 
#[1] FALSE 
+0

'sys.nframe()'不会在函数体内返回零,对吧? –

+0

当然不是,只有在全球环境中被调用。并发现这是任务,不是吗?检测全局环境中是否调用函数是一项不同的任务。 – Roland