Ho notato alcuni comportamenti inconsistenti (incoerenti) in data.table quando si utilizzano operatori di assegnazione diversi. Devo ammettere che non ho mai avuto la differenza tra "=" e copy(), quindi forse potremmo fare un po 'di luce qui. Se si utilizza "=" o "< -" invece di copy() di seguito, dopo aver modificato data.table copiato, anche la data.table originale cambierà.data.table 1.8.1 .: "DT1 = DT2" non è uguale a DT1 = copia (DT2)?
Si prega di eseguire i seguenti comandi e vedrete cosa intendo
library(data.table)
example(data.table)
DT
x y v
1: a 1 42
2: a 3 42
3: a 6 42
4: b 1 4
5: b 3 5
6: b 6 6
7: c 1 7
8: c 3 8
9: c 6 9
DT2 = DT
ora cambierò il v colonna DT2:
DT2[ ,v:=3L]
x y v
1: a 1 3
2: a 3 3
3: a 6 3
4: b 1 3
5: b 3 3
6: b 6 3
7: c 1 3
8: c 3 3
9: c 6 3
ma guarda cosa è successo a DT:
DT
x y v
1: a 1 3
2: a 3 3
3: a 6 3
4: b 1 3
5: b 3 3
6: b 6 3
7: c 1 3
8: c 3 3
9: c 6 3
modificato anche. così: cambiare DT2 ha cambiato il DT originale. non così se uso copy():
example(data.table) # reset DT
DT3 <- copy(DT)
DT3[, v:= 3L]
x y v
1: a 1 3
2: a 3 3
3: a 6 3
4: b 1 3
5: b 3 3
6: b 6 3
7: c 1 3
8: c 3 3
9: c 6 3
DT
x y v
1: a 1 42
2: a 3 42
3: a 6 42
4: b 1 4
5: b 3 5
6: b 6 6
7: c 1 7
8: c 3 8
9: c 6 9
questo comportamento è previsto?
Grazie @Andrie. Comprendo l'assegnazione per riferimento e perché evitare di copiare in primo luogo. Mi sembra strano che '=' crei un collegamento tra la copia e l'originale, come se fossero lo stesso oggetto (quando non è il caso in R altrimenti). –
@FlorianOswald Sono d'accordo: questa può essere una trappola se non si presta attenzione. – Andrie
+10 se potessi Andrie. @ Florian Immagina una tabella da 20 GB + in memoria. Non vogliamo assolutamente copiarlo, neanche una volta. Ma se lo vuoi davvero, puoi farlo. Non rompe la compatibilità con altri pacchetti, perché è solo ': =' e le funzioni 'set *' che assegnano per riferimento. È uno dei motivi per cui abbiamo introdotto un nuovo operatore (': ='), piuttosto che rendere '<-' un lavoro diverso. –