如何在R中获取变量的环境

Avi*_*ash 10 variables scope env r

我想知道是否还有获得声明变量的环境.假设我已经向环境声明了一个变量,并希望使用该变量的环境来声明更多变量.类似于getEnv("变量")

小智 7

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

library(pryr)
x <- 5
where("x")
#> <environment: R_GlobalEnv>
where("mean")
#> <environment: base>
Run Code Online (Sandbox Code Playgroud)

where函数在上面的网站中描述.它只找到变量出现的第一个环境,但可以很容易地修改以找到所有变量.


Mad*_*one 5

您可以使用工作区中的所有对象,ls()然后可以检查哪些是环境:

envirs <- ls()[sapply(ls(), function(x) is.environment(get(x)))]
Run Code Online (Sandbox Code Playgroud)

我需要在get()那里使用因为ls()返回对象的字符名称而不是对象本身.现在给出一些对象x,我们想要找到它存在的环境.我们需要做的就是遍历每个环境envirs,并检查它们是否包含我们正在寻找的任何对象.(检查变量x)的一些东西:

sapply(envirs, function(e) 'x' %in% ls(envir=get(e)))
Run Code Online (Sandbox Code Playgroud)

这是完成所有这些的功能:

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] 
}
Run Code Online (Sandbox Code Playgroud)

这或者与我在函数之外所做的大致相同.gobjects读取ls(),这次显式检查全局环境.GlobalEnv,因为它现在在一个函数内.

envirs和以前一样,除了现在它也会检查.GlobalEnv.xin正在存储x找到的环境的名称.该行:

xobj <- deparse(substitute(x))
Run Code Online (Sandbox Code Playgroud)

允许不带引号如被测试对象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"
Run Code Online (Sandbox Code Playgroud)

这仅检查在其中创建的环境.GlobalEnv.我相信如果你需要,你可以找出如何扩展它以搜索更多环境.

我很惊讶没有一些内置功能.或者也许有,我不知道.我以前从未真正需要做过这样的事情,所以也许这并不奇怪.


cod*_*ola 5

这个怎么样:

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

然后我们可以:

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>
Run Code Online (Sandbox Code Playgroud)