【发布时间】:2020-08-16 00:54:16
【问题描述】:
我想在搜索路径中添加一个环境,并在有限的代码块中修改该环境中变量的值,而不必在每次引用变量时都指定环境的名称:例如,给定环境
ee <- list2env(list(x=1,y=2))
现在我想做类似的事情
ee$x <- ee$x+1
ee$y <- ee$y*2
ee$z <- 6
但没有将ee$ 附加到所有内容(或使用assign("x", ee$x+1, ee) ...等):类似
in_environment(ee, {
x <- x+1
y <- y+2
z <- 6
})
我能想到的大多数解决方案都是明确设计的不是为了修改环境,例如
-
?attach:"实际上并没有附加数据库。而是一个新的环境 在搜索路径上创建..." -
within():采用列表或数据框(不是环境)“......并对‘数据’的副本进行相应的修改” -
<<-有两个问题:(1) 使用它会在 CRAN 检查中引起注意(我认为?找不到直接的证据,但例如 see here — 这可能只是因为外观而发生分配给本地未定义的符号?我想我可以把它放在一个包中并用--as-cran对其进行测试以确认...); (2) 它将尝试在父环境中分配,而在包上下文中 [this is] 将被锁定...
我想我可以使用Introduction to R 第 10.7 节中描述的闭包
clfun <- function() {
x <- 1
y <- 2
function(...) {
x <<- x + 1
y <<- y * 2
}
}
myfun <- clfun()
这看起来很复杂(但我想还不错吧?)但是:
- 仍会出现问题 #1(CRAN 检查?)。
- 我认为 (??) 它不适用于环境中尚不存在的变量(为此需要明确的
assign()...) - 不允许选择在哪个环境中运行 - 它必须在封闭环境中工作,而不是在任意环境
ee
我是否遗漏了一些明显和惯用的东西?
【问题讨论】:
-
with()怎么样? Here 它说with可以将环境作为其参数?不过,我真的不知道你在做什么,所以如果这与你正在寻找的内容不接近,我很抱歉。 -
你可能是对的!
-
@Nuclear03020704,如果您想将此作为答案发布,我会接受。