Comprender exactamente cuándo una tabla de datos es una referencia a (frente a una copia de) otra tabla de datos.
Me está costando entender las propiedades de paso por referencia dedata.table
. Algunas operaciones parecen "romper" la referencia, y me gustaría entender exactamente qué está sucediendo.
Al crear undata.table
de otrodata.table
(vía<-
, luego actualizando la nueva tabla por:=
, la mesa original también se altera. Esto se espera, según:
?data.table::copy
ystackoverflow: paso-por-referencia-el-operador-en-el-paquete-tabla-de-datos
Aquí hay un ejemplo:
<code>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 </code>
Sin embargo, si inserto un:=
modificación basada entre la<-
asignación y la:=
líneas arribaDT
Ahora ya no se modifica:
<code>DT = data.table(a=c(1,2), b=c(11,12)) newDT <- DT newDT$b[2] <- 200 # new operation newDT[1, a := 100] print(DT) # a b # [1,] 1 11 # [2,] 2 12 </code>
Así que parece que lanewDT$b[2] <- 200
La línea de alguna manera 'rompe' la referencia. Supongo que esto invoca una copia de alguna manera, pero me gustaría entender completamente cómo R está tratando estas operaciones, para asegurarme de no introducir posibles errores en mi código.
Apreciaría mucho si alguien me pudiera explicar esto.