我正在阅读有关环境的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函数更新,这到底是怎么回事?
答案 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"