Что делает `retracemem` в R? - PullRequest
       20

Что делает `retracemem` в R?

3 голосов
/ 07 сентября 2011

После ответа о tracemem недавно я узнал о retracemem.Помощь для ?retracemem и приведенный в ней пример оставляют меня неосведомленным.

Что на самом деле делает retracemem и почему?Он не делает то, что, как я думал, будет делать, т. Е. Указывает один объект на область памяти другого, по крайней мере, насколько я могу судить.

Я пробовал магический вызов, такой как .Internal(inspect()), которыйдля меня нет магии:

> a = 1:10
> b = a[-1]
> .Internal(inspect(a))
@00000000087AE578 13 INTSXP g0c4 [NAM(2)] (len=10, tl=23336) 1,2,3,4,5,...
> .Internal(inspect(b))
@00000000087AE8E8 13 INTSXP g0c4 [NAM(2)] (len=9, tl=7208) 2,3,4,5,6,...
> retracemem(b,retracemem(a))
> .Internal(inspect(b))
@00000000087AE8E8 13 INTSXP g0c4 [NAM(2)] (len=9, tl=7208) 2,3,4,5,6,...

1 Ответ

1 голос
/ 07 сентября 2011

Я думаю, что retracemem() просто позволяет вам пометить переменную копию, которая не выдаст оператор tracemem (например, b выше, который на самом деле является просто копией a без первого элемента), так как получены из той же исходной переменной, поэтому вы можете продолжать наблюдать за распространением копий / частичных копий и видеть, что они происходят из одного и того же источника.

Например, как память А копируется / распространяется:

> A <- 1:10
> tracemem(A)
[1] "<0x100a2a978>"
> B <- A                                # Assignment to B doesn't make copy
> C <- A + 1                            # Assignment to C makes copy, alters it
tracemem[0x100a2a978 -> 0x1020ebbf0]: 
> D <- C + 1                            # Assignment to D makes copy, alters it
tracemem[0x1020ebbf0 -> 0x1020ebc98]: 
> E <- B + 1                            # Assignment to E makes copy, alters it
tracemem[0x100a2a978 -> 0x1020a4208]: 
> F <- A[-1]                            # Assignment to F doesn't make copy?
> G <- F + 1                            # Even after altering it?
> retracemem(F, retracemem(A))          # Hint to R that F is really A derived
tracemem[<0x100a2a978> -> 0x1009c5910]: 
> G <- F + 1                            # Reassignment to G makes copy, alters it
tracemem[0x1009c5910 -> 0x1020a4748]: 

Но опять же, я могу быть совершенно неправ ...

...