修改列表和环境

时间:2018-11-28 21:48:23

标签: r list function environment

我正在阅读有关环境的Hadley Wickham AdvancedR。 Here提到:

  

与R中的大多数对象不同,在修改环境时,它不会   复制。例如,查看此Modify()函数。

modify <- function(x) {
  x$a <- 2
  invisible()
}
  

如果将其应用于列表,则原始列表不会更改,因为   修改列表实际上会创建和修改副本。

x_l <- list()
x_l$a <- 1
modify(x_l)
x_l$a
## [1] 1
  

但是,如果将其应用于环境,则原始环境   被修改:

x_e <- new.env()
x_e$a <- 1
modify(x_e)
x_e$a
## [1] 2

修改列表会创建并修改副本是什么意思?我看到在应用modify(x_l)之后,我假设x_l指向的对象已被修改。但是,它还没有(x_l$a还是1)。如果列表没有被Modify函数更新,这到底是怎么回事?

1 个答案:

答案 0 :(得分:2)

如果修改了列表,则会创建一个新列表(并且在函数中创建的对象是该函数的本地对象,并且在函数退出时将其删除)。请注意以下涉及L1的计算,并且L1的地址在修改后已更改。

另一方面,环境具有与其内容不同的身份。更改环境的内容不会更改环境的身份。请注意,在我们修改环境e1的内容之后,其地址没有改变。

library(pryr)

L1 <- list(a = 1)
address(L1)
## [1] "0xdb8aeb0"
L1$b <- 2
address(L1)
## [1] "0x841eca8"

e1 <- list2env(L1)
address(e1)
## [1] "0xbdf2420"
e1$c <- 3
address(e1)
## [1] "0xbdf2420"