Data.table: DT [TRUE] pode levar a chave inválida

Criado em 13 dez. 2018  ·  4Comentários  ·  Fonte: Rdatatable/data.table

Não sabia que DT[TRUE] era uma forma de obter uma cópia superficial. cópia rasa destinava-se apenas ao uso interno Obrigado a @ renkun-ken por destacar isso em # 3214 e relacionado # 2254.

  • [x] # 3214
  • [] # 2254

Na v1.11.8 vemos isso:

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

Só ocorre depois de DT[TRUE] , iiuc, que espero que as pessoas não tenham descoberto ou confiado em muito ?! Espero que o uso por aí seja como @ renkun-ken descrito para adicionar novas colunas à cópia superficial, não para alterar as colunas existentes!

Novo teste 1542.08 foi adicionado no PR # 2313 pronto para quando isso for corrigido.

bug

Comentários muito úteis

Sim, setkey, alterar as colunas existentes não deve ser usado na cópia superficial, pois as colunas em si não são copiadas.

Todos 4 comentários

Sim, setkey, alterar as colunas existentes não deve ser usado na cópia superficial, pois as colunas em si não são copiadas.

Se não permitirmos fazer uma cópia superficial com dt[TRUE] este problema será resolvido automaticamente.

Eventualmente. Mas enquanto isso, não podemos interromper o fluxo de trabalho de @ renkun-ken.
Mais detalhes aqui: https://github.com/Rdatatable/data.table/issues/3214#issuecomment -462490046

o código a seguir pode ser adicionado aos testes para garantir o comportamento de cópia

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)
Esta página foi útil?
0 / 5 - 0 avaliações