#
Minimal reproducible example
Я считаю, что произошла регрессия в data.table
в версии 1.12.0 по сравнению с 1.11.8. TL;DR
Я думаю, что реализация unique.data.table()
изменилась и что новая реализация не поддерживает сложные типы, такие как списки в столбцах.
Некоторые пользователи uptasticsearch сообщили о получении сообщения об ошибке из нашего кода, которое выглядит следующим образом:
Ошибка в forderv(x, by = by, sort = FALSE, retGrp = TRUE):
Столбец 2 by= (2) имеет тип «список», еще не поддерживается
После расследования сегодня вечером я нашел источник проблемы и могу воспроизвести его. Я считаю, что поведение unique()
изменилось, и я считаю это изменение регрессом.
В 1.12.0:
someDT <- data.table::data.table(
col1 = 1:2,
col2 = list(list(TRUE, FALSE), list(FALSE, TRUE))
)
unique(someDT)
Выдает ошибку
Ошибка в forderv(x, by = by, sort = FALSE, retGrp = TRUE):
Столбец 2 by= (2) имеет тип «список», еще не поддерживается
Чтобы перейти на предыдущую версию, я выполнил следующее из командной строки:
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
Как только у меня была установлена версия 1.11.8, я повторно запустил приведенный выше код R.
someDT <- data.table::data.table(
col1 = 1:2,
col2 = list(list(TRUE, FALSE), list(FALSE, TRUE))
)
unique(someDT)
Работает как положено и возвращает:
col1 col2
1: 1 <list>
2: 2 <list>
Итак, я взял на себя вину за unique.data.table() , чтобы посмотреть, что было. измененный. Похоже, между 1.11.8 и сейчас не было внесено существенных изменений, поэтому тогда я подумал посмотреть на вину за forderv()
.
Я тоже не увидел ничего осмысленного в обвинении forderv() .
Я решил попробовать еще одну вещь... поиск текста «еще не поддерживается» (из сообщения об ошибке). Это привело меня к forder.c
, вина которых привела меня к #3124.
Насколько я могу судить, этот PR является источником проблемы выше. В PR нет описания, поэтому я не уверен, является ли это непреднамеренным побочным эффектом или известным регрессом, который будет исправлен в будущем выпуске data.table
.
#
Output of sessionInfo()
R версия 3.5.0 (23 апреля 2018 г.)
Платформа: x86_64-apple-darwin15.6.0 (64-разрядная версия)
Работает под: macOS High Sierra 10.13.6
Матричные продукты: по умолчанию
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
локаль:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
прилагаемые базовые пакеты:
[1] статистика графики grDevices использует базу данных методов
загружается через пространство имен (и не прикрепляется):
[1] компилятор_3.5.0 инструменты_3.5.0 yaml_2.2.0 данные.таблица_1.12.0
Спасибо за обстоятельный отчет!
Спасибо @jameslamb! В версии 1.11.8 вы также получаете сообщение об ошибке, если уникальность не разрешается перед столбцом 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
В этом примере я изменил col1
, чтобы он содержал дубликаты, поэтому col2
затем необходим для определения уникальности.
v1.12.0+ проверяет типы всех столбцов перед запуском алгоритма. Выполнение этой проверки заранее упрощает внутреннюю работу с параллелизмом.
Чтобы заставить его работать и исключить столбцы list
, используйте аргумент by=
для указания (возможно) первых нескольких столбцов. Так как уникальность в столбцах list
все равно не работала, я думаю, что, вероятно, лучше быть вынужденным быть явным, чем внезапно удивляться ошибке позже, когда повторы действительно происходят в не- list
столбцы.
> unique(DT, by="col1")
col1 col2
1: 1 <list>
>
Добавлю что-нибудь в НОВОСТИ и предложение к сообщению об ошибке...
@mattdowle а, ладно, имеет смысл! Спасибо, что посмотрели и разъяснили сообщение об ошибке.
Самый полезный комментарий
Спасибо за обстоятельный отчет!