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:
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
Sin embargo, si inserto un:=
modificación basada entre la<-
asignación y la:=
líneas arribaDT
Ahora ya no se modifica:
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
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.