如何获得R中变量的环境(How to get environment of a variable i

2019-09-03 14:48发布

我想知道是否有无论如何得到一个声明的变量的环境。 说我已经宣布的环境变量,并希望使用该变量的环境来声明几个变量。 喜欢的东西GETENV(“变量”)

Answer 1:

请参阅: http://adv-r.had.co.nz/Environments.html#env-basics

library(pryr)
x <- 5
where("x")
#> <environment: R_GlobalEnv>
where("mean")
#> <environment: base>

的,其中功能在上述网站进行说明。 它只能找到变量出现在第一环境,但可以很容易地进行修改,以找到所有。



Answer 2:

你可以在你的工作空间中的所有对象ls()这样的话,你可以检查哪些这些都是环境:

envirs <- ls()[sapply(ls(), function(x) is.environment(get(x)))]

我需要使用get() ,因为有ls()返回一个对象,而不是对象本身的角色的名字。 现在给出了一些对象x ,我们想找到它存在于其中的环境。所有我们需要做的是通过在每个迭代环境envirs ,并检查他们是否包含任何对象,我们要寻找的。 沿(检查一个变量的东西线x ):

sapply(envirs, function(e) 'x' %in% ls(envir=get(e)))

这里有一个函数来做到这一切:

getEnv <- function(x) {
  xobj <- deparse(substitute(x))
  gobjects <- ls(envir=.GlobalEnv)
  envirs <- gobjects[sapply(gobjects, function(x) is.environment(get(x)))]
  envirs <- c('.GlobalEnv', envirs)
  xin <- sapply(envirs, function(e) xobj %in% ls(envir=get(e)))
  envirs[xin] 
}

这或多或少是一样的我做了什么功能之外。 gobjects从读取ls()这一次明确确认全球环境.GlobalEnv ,因为它现在是一个函数内。

envirs是和以前一样,只是现在它会检查.GlobalEnv为好。 xin被存储其中的环境的名称x在该生产线中:

xobj <- deparse(substitute(x))

允许没有引号待测试对象,例如getEnv(x)getEnv('x') 这是偏好的问题,虽然,你可以改变它,而不是接受字符。


下面是一些测试。

x1 <- 1
getEnv(x1)
# ".GlobalEnv"

x2 <- 2.1
e2 <- new.env()
assign('x2', 2.2, e2)
getEnv(x2)
# ".GlobalEnv" "e2" 

e3 <- new.env()
assign('x3', 3, e3)
getEnv(x3)
# "e3"

这仅检查环境中创建.GlobalEnv 。 我敢肯定,你可以计算出如何扩展它但如果你需要在更多的环境中进行搜索。

我很惊讶没有一些内置的功能这一点。 或者,也许有,我不知道这件事情。 我从来没有实际需要之前做这样的事,所以也许它不是真正令人惊讶。



Answer 3:

这个怎么样:

getEnvOf <- function(what, which=rev(sys.parents())) {
  for (frame in which)
    if (exists(what, frame=frame, inherits=FALSE)) 
      return(sys.frame(frame))
  return(NULL)
}

然后,我们可以:

x <- 1
getEnvOf("x")
# <environment: R_GlobalEnv>

getEnvOf("y")
# NULL

f <- function() getEnvOf("x")
f()
# <environment: R_GlobalEnv>

g <- function() { x <- 2; getEnvOf("x") }
g()
# <environment: 0x114c26518>


文章来源: How to get environment of a variable in R