4

環境がグローバル環境であるかどうかを検出し、それに応じて行動することが役立つ場合があります。私は、環境を検出し、それがグローバル環境であるかどうかをテストする方法であると信じている方法を考え出しました。より良い方法がある場合、またはこれに穴がある場合などに車輪を再発明したくないだけです。global_test以下またはより良いアプローチを行うための組み込みのRメソッドはありますか?

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は、実際には のヘルプ ページの例の 1 つです?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 に答える