Po to, aby wyczyścić niektóre rzeczy dla siebie, chciałbym lepiej zrozumieć, kiedy kopie są tworzone, a kiedy nie są w data.table
. Ponieważ kwestia ta wskazuje, Understanding exactly when a data.table is a reference to (vs a copy of) another data.table, jeśli ktoś po prostu uruchamia następujące potem skończyć modyfikację oryginału:zrozumienie właściwości referencyjnych pliku data.table w R
library(data.table)
DT <- data.table(a=c(1,2), b=c(11,12))
print(DT)
# a b
# [1,] 1 11
# [2,] 2 12
newDT <- DT # reference, not copy
newDT[1, a := 100] # modify new DT
print(DT) # DT is modified too.
# a b
# [1,] 100 11
# [2,] 2 12
Jednakże, jeśli ktoś to robi (na przykład), a następnie skończyć modyfikację nowej wersji:
DT = data.table(a=1:10)
DT
a
1: 1
2: 2
3: 3
4: 4
5: 5
6: 6
7: 7
8: 8
9: 9
10: 10
newDT = DT[a<11]
newDT
a
1: 1
2: 2
3: 3
4: 4
5: 5
6: 6
7: 7
8: 8
9: 9
10: 10
newDT[1:5,a:=0L]
newDT
a
1: 0
2: 0
3: 0
4: 0
5: 0
6: 6
7: 7
8: 8
9: 9
10: 10
DT
a
1: 1
2: 2
3: 3
4: 4
5: 5
6: 6
7: 7
8: 8
9: 9
10: 10
jak rozumiem, powodem takiej sytuacji jest, ponieważ kiedy wykonać i
oświadczenie, data.table
zwraca zupełnie nowy stół w przeciwieństwie do odniesienia do pamięci zajmowanej przez wybranych elementów starego data.table
. Czy to jest poprawne i prawdziwe?
EDIT: Przepraszam, że nie rozumie i
j
(zmiana ta powyżej)
Nawet 'newDT <- DT [x <11]' utworzyłoby kopię. Do, 'newDT [, b: = 5]' po utworzeniu 'newDT' przez podzbiór. Użyj 'tracemem' i' .Internal (inspect (.)) 'Są narzędziami informacyjnymi do zrozumienia tego. – Arun
@Arun: Przepraszam, nie jestem pewien, czy rozumiem twój punkt. Czy mógłbyś wyjaśnić, o czym mówisz? Czy chcesz powiedzieć, że pierwszy przykład zadziała tak samo jak drugi? w takim razie tak - to prawda. chciałem tylko osobnego przykładu, żeby wszystko wyjaśnić. – Alex
z pewnością, czy możesz wyjaśnić, o której tu mowa: "J", o której tutaj mowa: "tak jak rozumiem, powodem tego jest to, że kiedy wykonujesz wyrażenie j", po prostu upewnij się. Napiszę odpowiedź, o której wtedy mówiłem. – Arun