Data.table: Должен ли rbindlist (..., fill = TRUE) возвращать NA_logical_ в столбцах списка?

Созданный на 25 янв. 2020  ·  6Комментарии  ·  Источник: Rdatatable/data.table

С номера 4196:

При заполнении столбца списка rbindlist отклоняется от поведения всех других типов столбцов и возвращает элементы NULL вместо 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   

Ожидал:

> 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   

Должны ли мы изменить это поведение для столбцов списка, чтобы заполнить строки значениями NA, чтобы они соответствовали поведению fill = TRUE для других типов столбцов?

non-atomic column question

Самый полезный комментарий

Что, если вместо этого мы просто добавим в документацию предложение, описывающее поведение в случае отсутствующего столбца списка:

Текущая запись для аргумента заполнения:

TRUE заполняет недостающие столбцы NA. По умолчанию ЛОЖЬ. Когда TRUE, для use.names установлено значение TRUE.

Предложил:

TRUE заполняет отсутствующие столбцы NAs или NULL для отсутствующих столбцов списка. По умолчанию ЛОЖЬ. Когда TRUE, для use.names установлено значение TRUE.

Все 6 Комментарий

PR с предоставлением исправления, если мы хотим внести изменения

Мне кажется, что нынешнее поведение нормально.

> str(as.integer(NULL)[1L])
 int NA
> str(as.list(NULL)[1L])
List of 1
 $ : NULL

ИМО это не должно быть NA, потому что:

  • он изменяет тип с отсутствующего поля (неопределенного) на логический вектор
  • он изменяет длину с 0 на длину 1

Я склоняюсь к точке зрения Яна. Текущее поведение пустого элемента на самом деле представляет собой способ представления отсутствующего элемента списком (нет никакого объекта, на который можно было бы указать). Мы могли бы построить пример, в котором каждый элемент списка был бы логическим вектором, каждый элемент был бы результатом некоторого вычисления. В таком случае может потребоваться представление 3 различных состояний: логической длины 0, логической длины 1 NA и отсутствия вычисления. Если логическая длина 1 NA использовалась для пропуска, эти 2 не могли быть различимы.

Достаточно ли изменить метод печати? Вместо того, чтобы ничего не печатать, как насчет NULL ? Вывод NA может снова означать логическую длину 1 NA, тогда как NULL будет однозначным, согласованным с тем, что базовый R печатает для пустых элементов списка, и даст дополнительное визуальное напоминание о том, что это был список столбец.

также согласны с w Jan, в частности о длине 0 -> length 1.

Я часто использую lengths (x)> 0 для фильтрации строк по пустым столбцам списка.

мы могли бы предположить, что вместо этого поместим здесь logical (), есть ли какое-то преимущество у logical () перед NULL?

Что, если вместо этого мы просто добавим в документацию предложение, описывающее поведение в случае отсутствующего столбца списка:

Текущая запись для аргумента заполнения:

TRUE заполняет недостающие столбцы NA. По умолчанию ЛОЖЬ. Когда TRUE, для use.names установлено значение TRUE.

Предложил:

TRUE заполняет отсутствующие столбцы NAs или NULL для отсутствующих столбцов списка. По умолчанию ЛОЖЬ. Когда TRUE, для use.names установлено значение TRUE.

Смена документа выглядит неплохо. Плюс изменение метода печати, которое я тоже предложил?

Была ли эта страница полезной?
0 / 5 - 0 рейтинги