通过引用id分配给环境(即不将env.传递给子函数)

程序员经常在较大的函数内使用多个小函数.在此过程中,我们可能希望在环境中收集内容以供日后参考.我们可以使用new.env(hash = FALSE)创建一个环境,并将其传递给较小的函数并使用assign进行赋值.好吧,花花公子.我想知道我们是否可以使用环境的引用ID而不是将其传递给子函数,但仍然通过引用环境id分配给环境.

所以我在这里

myenv <- new.env(hash=FALSE)
## <environment: 0x00000000588cc918>

如果我传递给孩子的环境,那么典型的就像这样分配.

assign("elem1", 35, myenv)

myenv[["elem1"]]
# 35

我想要的是在父函数中创建环境并传递引用id,所以我想做类似的事情:

assign("elem2", 123, "0x00000000588cc918")

但可以预见的结果是:

## Error in as.environment(pos) : 
##   no item called "0x00000000588cc918" on the search list

是否可以传递环境ID并使用它?这似乎比将环境从一个函数传递给另一个函数并以列表形式返回然后在该列表中的环境中操作更简洁……并且可能更高效.

我也想通过引用访问这个环境.

最佳答案 环境不像列表.将环境传递给函数不会复制其内容,即使在函数内修改了环境的内容,因此您不必担心效率低下.此外,当环境传递给修改其内容的函数时,即使在函数完成后也会保留内容,因此与列表的情况不同,不需要将环境传回.

例如,下面的代码将环境e传递给函数f,f修改它的内容但不传递回来. f完成后,调用者会看到更改.

    f <- function(x, env) { 
       env$X <- x
       TRUE 
    }

    e <- new.env()
    f(1, e)
    ## [1] TRUE

    e$X
    ## [1] 1

更多关于Hadely的书中的环境:http://adv-r.had.co.nz/Environments.html

点赞