No me di cuenta de que DT[TRUE]
era una forma de lograr una copia superficial. La copia superficial solo estaba destinada para uso interno. Gracias a @ renkun-ken por resaltar esto en el # 3214, y relacionado con el # 2254.
En v1.11.8 vemos esto:
DT = data.table(id = 1:5, key="id")
DT1 = DT[TRUE]
key(DT1)
[1] "id"
DT1[3, id:=6L]
key(DT1)
# NULL # correct
DT$id
# [1] 1 2 6 4 5 # should be 1:5
key(DT)
# [1] "id" # invalid key
¡Solo ocurre después de DT[TRUE]
, iiuc, que con suerte la gente no ha descubierto o confiado demasiado? Espero que el uso sea como el descrito por @ renkun-ken para agregar nuevas columnas a la copia superficial, ¡no para cambiar las columnas existentes!
Se agregó la nueva prueba 1542.08 en PR # 2313 lista para cuando esto se solucione.
Sí, setkey, el cambio de columnas existentes no debe usarse en la copia superficial, ya que las columnas en sí no se copian.
Si no permitimos hacer una copia superficial con dt[TRUE]
este problema se resolverá automáticamente.
Finalmente. Pero mientras tanto, no podemos romper el flujo de trabajo de @ renkun-ken.
Más detalles aquí: https://github.com/Rdatatable/data.table/issues/3214#issuecomment -462490046
el siguiente código podría agregarse a las pruebas para garantizar el comportamiento de la copia
DT = data.table(a=c(1,2), b=c("b","a"))
address(DT)
address(DT[])
address(DT[, .SD])
address(DT[TRUE])
sapply(DT, address)
sapply(DT[], address)
sapply(DT[, .SD], address)
sapply(DT[TRUE], address)
Comentario más útil
Sí, setkey, el cambio de columnas existentes no debe usarse en la copia superficial, ya que las columnas en sí no se copian.