Является ли нарезка копировать на модифицировать в R? - PullRequest
0 голосов
/ 27 февраля 2019

Упоминается здесь , что R использует copy-on-modify при назначении переменной новой, включая передачу параметра в функцию.

Тем не менее, срезы (vector, list, data frame) создают новый объект того же типа, который содержит oopies подмножества исходного объекта, или же элементы хранятся вновый объект - копия исходного или просто ссылка "копия при изменении"?

Ответы [ 3 ]

0 голосов
/ 27 февраля 2019

Это сложная тема.Вы должны начать с чтения о NAMED механизме .

Если вы запустите следующее, вы увидите, что нет копии элементов списка (поскольку списки в основном являются указателями на их элементы):

> a <- list(1, 2, 3, 4, 5)
> 
> b <- a[1:2]
> .Internal(inspect(b)) 
@0x000000001327e5b8 19 VECSXP g0c2 [NAM(3)] (len=2, tl=0)
  @0x00000000136f6b60 14 REALSXP g0c1 [NAM(3)] (len=1, tl=0) 1
  @0x00000000136f6b28 14 REALSXP g0c1 [NAM(3)] (len=1, tl=0) 2
> 
> 
> c <- a[1:2]
> .Internal(inspect(c)) 
@0x000000001327e678 19 VECSXP g0c2 [NAM(3)] (len=2, tl=0)
  @0x00000000136f6b60 14 REALSXP g0c1 [NAM(3)] (len=1, tl=0) 1
  @0x00000000136f6b28 14 REALSXP g0c1 [NAM(3)] (len=1, tl=0) 2
> 
> b[1] <- 6
> .Internal(inspect(b)) 
@0x000000001327e6f8 19 VECSXP g0c2 [NAM(1)] (len=2, tl=0)
  @0x0000000013745b58 14 REALSXP g0c1 [] (len=1, tl=0) 6
  @0x00000000136f6b28 14 REALSXP g0c1 [NAM(3)] (len=1, tl=0) 2
> 
> .Internal(inspect(c))
@0x000000001327e678 19 VECSXP g0c2 [NAM(3)] (len=2, tl=0)
  @0x00000000136f6b60 14 REALSXP g0c1 [NAM(3)] (len=1, tl=0) 1
  @0x00000000136f6b28 14 REALSXP g0c1 [NAM(3)] (len=1, tl=0) 2

В случае подмножества векторов это не так.

Возможно, вас также заинтересует новый механизм подсчета ссылок 1011 *.

0 голосов
/ 27 февраля 2019

Подстановка атомного вектора к более короткому даст вам новый вектор.Подстановка целых векторов из объектов дает вам ссылку «копировать при изменении».Следствием этого является то, что вы можете создать подмножество для получения нового объекта с более коротким списком, но его содержимое будет ссылаться на содержимое в исходном (без общей стоимости памяти) до тех пор, пока вы не измените.

См. Замечания Хэдли по управлению памятью для более подробной информации.

0 голосов
/ 27 февраля 2019

В отличие от python, R создает новые объекты каждый раз, когда вы их нарезаете.Например:

> a=c(1,2,3,4,5)
> a
[1] 1 2 3 4 5
> b=a[1]
> b
[1] 1
> b=7
> b
[1] 7
> a
[1] 1 2 3 4 5

То же самое работает для vectors, lists или dataframes.Посмотрите этот пост для ссылочных объектов в R.

...