我想知道是否还有获得声明变量的环境。假设我已经向环境声明了一个变量,并希望使用该变量的环境来声明更多变量。像getEnv(“变量”)
之类的东西答案 0 :(得分:7)
参考: http://adv-r.had.co.nz/Environments.html#env-basics
library(pryr)
x <- 5
where("x")
#> <environment: R_GlobalEnv>
where("mean")
#> <environment: base>
上述网站描述了where功能。它只找到变量出现的第一个环境,但可以很容易地修改以找到所有。
答案 1 :(得分:5)
您可以使用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
内创建的环境。我相信你可以解决如何扩展它以在更多环境中搜索,但如果你需要的话。
我很惊讶没有一些内置功能。或者也许有,我不知道。我之前从未真正需要做过这样的事情,所以也许这并不奇怪。
答案 2 :(得分:1)
这个怎么样:
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>
答案 3 :(得分:0)
您可以按照注释中的建议使用find
在searchpath
中搜索对象的环境。如果您想停留在功能调用堆栈中,则可以使用exists
来查看sys.frame
。
findFrame <- function(what) {
n <- sys.nframe()-1
Filter(Negate(is.null), lapply(n:0, function(i) {
if(exists(what, sys.frame(i), inherits=FALSE)) sys.frame(i)}))
}
x <- 0
f1 <- function() {
x <- 1
f2()
}
f2 <- function() {
x <- 2
tt <- find("x")
print(sapply(tt, as.environment))
tt <- findFrame("x")
print(tt)
}
a <- new.env(parent=emptyenv())
a$x <- 3
attach(a)
b <- new.env(parent=emptyenv())
b$x <- 4
find("x")
#[1] ".GlobalEnv" "a"
findFrame("x")
#[[1]]
#<environment: R_GlobalEnv>
f1()
#$.GlobalEnv
#<environment: R_GlobalEnv>
#
#$a
#<environment: 0x5576b0c7bb80>
#attr(,"name")
#[1] "a"
#
#[[1]]
#<environment: 0x5576af2fa1f8>
#
#[[2]]
#<environment: 0x5576aedcab20>
#
#[[3]]
#<environment: R_GlobalEnv>
f2()
#$.GlobalEnv
#<environment: R_GlobalEnv>
#
#$a
#<environment: 0x5576b0c7bb80>
#attr(,"name")
#[1] "a"
#
#[[1]]
#<environment: 0x5576b013bef0>
#
#[[2]]
#<environment: R_GlobalEnv>