2011-11-06 7 views
24

Al probar mi código, he encontrado el siguiente: si le asigno un data.table DT1 a DTDT y cambiar después, DT1 cambia con eso. De modo que DT y DT1 parecen estar vinculados internamente. ¿Es este comportamiento intencionado? Aunque no soy un experto en programación, esto me parece incorrecto, y al probarlo con simples variables R o un data.frame, no pude reproducir el comportamiento. ¿Que esta pasando aqui?: = (paso por referencia) del operador en el paquete data.table modifica otro objeto tabla de datos de forma simultánea

DF <- data.frame(ID=letters[1:5], 
        value=1:5) 
DF1 <- DF 
all.equal(DF1, DF) 
[1] TRUE 
DF[1, "value"] <- DF[1, "value"]*2 
all.equal(DF1, DF) 
[1] "Component 2: Mean relative difference: 1" 

library(data.table) 
data.table 1.7.1 For help type: help("data.table") 
DT <- data.table(ID=letters[1:5], 
        value=1:5) 
DT1 <- DT 
all.equal(DT1, DT) 
[1] TRUE 
DT[, value:=value*2] 
    ID value 
[1,] a  2 
[2,] b  4 
[3,] c  6 
[4,] d  8 
[5,] e 10 
all.equal(DT1, DT) 
[1] TRUE 

Respuesta

24

Esta pieza de documentación en data.table ayudaría. ? data.table::copy

No se devuelve ningún valor. El data.table se modifica por referencia. Si necesita una copia, primero tome una copia (usando DT2 = copy (DT)). copy() también puede ser útil algunas veces antes de: = se usa para asignar una columna por referencia.

Cuestiones relacionadas