我想在有限的代码块中向搜索路径添加一个环境,并修改该环境中变量的值,而不必每次引用变量时都指定环境的名称:例如,给定环境
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
})
我能想到的大多数解决方案都是明确设计的,而不是来修改环境,例如
- CCD_ 3";数据库实际上并没有附加。相反,一个新的环境在搜索路径上创建">
within()
:取列表或数据帧(非环境(";。。。并对"数据"的副本进行相应的修改<<-
有两个问题:(1(使用它会在CRAN检查中导致NOTE(我认为?找不到这方面的直接证据,但例如,请看这里——也许这只是因为出现了分配给本地未定义符号的现象?我想我可以把它放在一个包中,用--as-cran
测试它来确认…(;(2( 它将尝试在父环境中进行分配,在包上下文中[这是]将被锁定
我想我可以通过使用R简介第10.7节中描述的闭包
clfun <- function() {
x <- 1
y <- 2
function(...) {
x <<- x + 1
y <<- y * 2
}
}
myfun <- clfun()
这看起来很复杂(但我想还不错吧?(但是:
- 仍然会产生问题#1(CRAN检查?(
- 我认为(??(它不适用于环境中不存在的变量(需要一个显式的
assign()
…( - 不允许选择在哪个环境中操作-它必须在封闭环境中工作,而不是在任意环境
ee
中工作
我是不是遗漏了一些明显而惯用的东西?
感谢@Nuclear03020704!我认为with()
是我一直想要的;我错误地假设它也会创建环境的本地副本,但只有当data
参数还不是环境时,它才会这样做。
ee <- list2env(list(x=1,y=2))
with(ee, {
x <- x+1
y <- y+2
z <- 6
})
正是我想要的。
刚刚有了另一个想法,它似乎也有一些缺点:使用一个大的eval
子句。我不想把我的问题列为一长串不令人满意的解决方案,而是把它添加到这里。
myfun <- function() {
eval(quote( {
x <- x+1
y <- y*2
z <- 3
}), envir=ee)
}
这看起来确实有效,但也显得非常奇怪/神秘!我不想向一个使用R不到10年的人解释。。。我想我可以在此基础上编写一个in_environment()
,但我必须非常小心,在不评估它的情况下正确地捕捉表达式。。。
with()
怎么样?从这里开始,
with(data, expr)
CCD_ 15是用于构建环境的数据。对于默认的with方法,它可能是一个环境、一个列表、一个数据帧或一个整数。
CCD_ 16是要评估的表达式。
CCD_ 17是在由数据构建的本地环境中评估CCD_ 18的通用函数。环境将调用方的环境作为其父环境。这对于简化对建模函数的调用非常有用。(注意:如果
data
已经是一个环境,那么它将与现有的父环境一起使用。(请注意,
expr
中的分配是在构建的环境中进行的,而不是在用户的工作空间中。CCD_ 21返回被评估的CCD_。
ee <- list2env(list(x=1,y=2))
with(ee, {
x <- x+1
y <- y+2
z <- 6
})