Изменение списков и сред - PullRequest
0 голосов
/ 29 ноября 2018

Я читаю Hadley Wickham Advanced R в средах. Здесь упоминается:

В отличие от большинства объектов в 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).Что происходит под капотом, когда список не обновляется функцией модификации?

1 Ответ

0 голосов
/ 29 ноября 2018

Если список изменяется, то создается новый список (и объект, который создается в функции, является локальным для этой функции и удаляется при выходе из функции).Обратите внимание на приведенные ниже вычисления с использованием 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"
...