我想知道是否有无论如何得到一个声明的变量的环境。 说我已经宣布的环境变量,并希望使用该变量的环境来声明几个变量。 喜欢的东西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