De # 4196:
Ao preencher uma coluna da lista, rbindlist se afasta do comportamento de todos os outros tipos de coluna e retorna elementos NULL em vez de NA:
> A = data.table(c1=0, c2=list(1:3))
> B = data.table(c1=1)
> rbind(A,B,fill=TRUE)
c1 c2
<num> <list>
1: 0 1,2,3
2: 1
Esperado:
> A = data.table(c1=0, c2=list(1:3))
> B = data.table(c1=1)
> rbind(A,B,fill=TRUE)
c1 c2
<num> <list>
1: 0 1,2,3
2: 1 NA
Devemos mudar esse comportamento para as colunas da lista para preencher as linhas com valores NA para corresponder ao comportamento de fill = TRUE para outros tipos de coluna?
PR com correção fornecida se quisermos fazer a mudança
O comportamento atual parece bom para mim.
> str(as.integer(NULL)[1L])
int NA
> str(as.list(NULL)[1L])
List of 1
$ : NULL
IMO, não deve ser NA porque:
Estou inclinado para o ponto de Jan. O comportamento atual de um elemento vazio é, na verdade, uma forma de lista de representar o que está faltando (não há nenhum objeto para o qual apontar). Poderíamos construir um exemplo em que cada item da lista fosse um vetor lógico, cada item sendo o resultado de algum cálculo. Nesse caso, 3 estados diferentes podem precisar ser representados: comprimento 0 lógico, comprimento 1 NA lógico e computação ausente. Se o comprimento 1 NA lógico foi usado para ausente, aqueles 2 não puderam ser distinguidos.
Mudar o método de impressão seria suficiente? Em vez de nada ser impresso, que tal NULL
? Imprimir NA
poderia implicar novamente em um comprimento 1 NA lógico, enquanto NULL
não seria ambíguo, consistente com o que a base R imprime para itens de lista vazios, e daria um lembrete visual adicional de que era uma lista coluna.
também concordo com Jan, em particular sobre o comprimento 0 -> comprimento 1.
Estou usando muito lengths (x)> 0 para filtrar linhas por colunas de lista vazias.
poderíamos, suponho, colocar lógico () lá, há alguma vantagem de lógico () em relação a NULL?
E se, em vez disso, adicionarmos uma frase à documentação, observando o comportamento no caso de uma coluna da lista ausente:
Entrada atual para o argumento de preenchimento:
TRUE preenche as colunas ausentes com NAs. Por padrão, FALSE. Quando TRUE, use.names é definido como TRUE.
Proposta:
TRUE preenche colunas ausentes com NAs ou NULL para colunas de lista ausentes. Por padrão, FALSE. Quando TRUE, use.names é definido como TRUE.
A mudança de documento parece boa. Além da mudança no método de impressão que eu sugeri também?
Comentários muito úteis
E se, em vez disso, adicionarmos uma frase à documentação, observando o comportamento no caso de uma coluna da lista ausente:
Entrada atual para o argumento de preenchimento:
Proposta: