r-相当于在环境中工作的within()、attach()等



我想在有限的代码块中向搜索路径添加一个环境,并修改该环境中变量的值,而不必每次引用变量时都指定环境的名称:例如,给定环境

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
})

最新更新