2013-09-05 88 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