Data.table: DT [TRUE] puede generar una clave no válida

Creado en 13 dic. 2018  ·  4Comentarios  ·  Fuente: Rdatatable/data.table

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.

  • [x] n.º 3214
  • [] # 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.

bug

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.

Todos 4 comentarios

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)
¿Fue útil esta página
0 / 5 - 0 calificaciones