#
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
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.
Comentários muito úteis
Obrigado pelo relato completo!