Data.table: Regressão em unique.data.table() a partir de data.table 1.12.0

Criado em 30 jan. 2019  ·  3Comentários  ·  Fonte: Rdatatable/data.table

# Minimal reproducible example

Acredito que houve uma regressão em data.table na versão 1.12.0 em relação a 1.11.8. TL;DR

Acho que a implementação de unique.data.table() mudou e que a nova implementação não suporta tipos complexos como listas em colunas.

Alguns usuários do uptasticsearch relataram ter recebido uma mensagem de erro do nosso código que se parece com isso:

Erro em forderv(x, by = by, sort = FALSE, retGrp = TRUE):
A coluna 2 de by= (2) é do tipo 'list', ainda não suportada

Depois de investigar esta noite, encontrei a fonte do problema e posso reproduzi-lo. Eu acredito que o comportamento de unique() mudou e eu consideraria essa mudança uma regressão.

Em 1.12.0:

someDT <- data.table::data.table(
    col1 = 1:2,
    col2 = list(list(TRUE, FALSE), list(FALSE, TRUE))
)
unique(someDT)

Gera erro

Erro em forderv(x, by = by, sort = FALSE, retGrp = TRUE):
A coluna 2 de by= (2) é do tipo 'list', ainda não suportada

Para fazer o downgrade para a versão anterior, executei o seguinte na linha de comando:

Rscript -e "remove.packages('data.table')"
wget http://cran.rstudio.com/src/contrib/Archive/data.table/data.table_1.11.8.tar.gz
R CMD INSTALL data.table_1.11.8.tar.gz

Depois de instalar a v 1.11.8, executei novamente o código R acima

someDT <- data.table::data.table(
    col1 = 1:2,
    col2 = list(list(TRUE, FALSE), list(FALSE, TRUE))
)
unique(someDT)

Funciona como esperado e retorna:

   col1   col2
1:    1 <list>
2:    2 <list>

Então eu fui a culpa de unique.data.table() para ver o que tinha . mudado. Parecia que nenhuma mudança substancial foi feita entre 1.11.8 e agora, então pensei em olhar para a culpa por forderv() .

Também não vi nada significativo na culpa por forderv() .

Eu decidi tentar mais uma coisa...procurando pelo texto "ainda não suportado" (da mensagem de erro). Isso me levou a forder.c , cuja culpa me levou a #3124.

Tanto quanto eu posso dizer, este PR é a fonte do problema acima. Não há descrição no PR, então não tenho certeza se isso é um efeito colateral não intencional ou uma regressão conhecida que será corrigida em uma versão futura de data.table .

# Output of sessionInfo()

Versão R 3.5.0 (23/04/2018)
Plataforma: x86_64-apple-darwin15.6.0 (64 bits)
Executando em: macOS High Sierra 10.13.6

Produtos da matriz: padrão
BLAS: /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/3.5/Resources/lib/libRlapack.dylib

localidade:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

pacotes de base anexados:
[1] gráficos de estatísticas grDevices utils datasets métodos base

carregado por meio de um namespace (e não anexado):
[1] compilador_3.5.0 ferramentas_3.5.0 yaml_2.2.0 dados.tabela_1.12.0

Comentários muito úteis

Obrigado pelo relato completo!

Todos 3 comentários

Obrigado pelo relato completo!

Obrigado @jameslamb! Na versão 1.11.8, você também recebe o erro se a exclusividade não for resolvida antes da coluna list :

# with data.table 1.11.8 : 
DT = data.table(
    col1 = c(1,1),
    col2 = list(list(TRUE, FALSE), list(FALSE, TRUE))
)
unique(DT)
Error in forderv(x, by = by, sort = FALSE, retGrp = TRUE) : 
  Column 2 of 'by' (2) is type 'list', not yet supported

Nesse exemplo, alterei col1 para conter duplicatas, de modo que col2 seja necessário para decidir a exclusividade.

v1.12.0+ verifica os tipos de todas as colunas antes de iniciar o algoritmo. Fazer essa verificação antecipadamente facilita as coisas internamente para o paralelismo.

Para fazê-lo funcionar e excluir as colunas list , use o argumento by= para especificar (provavelmente) as primeiras colunas. Como o exclusivo nas colunas list não funcionou de qualquer maneira, acho que provavelmente é melhor ser forçado a ser explícito, em vez de ser surpreendido de repente pelo erro mais tarde, quando ocorrerem dups no não- list colunas.

> unique(DT, by="col1")
    col1   col2
1:     1 <list>
> 

Vou adicionar algo no NEWS e uma sugestão na mensagem de erro...

@mattdowle ah ok, faz sentido! Obrigado por dar uma olhada e por esclarecer a mensagem de erro.

Esta página foi útil?
0 / 5 - 0 avaliações