Data.table: Регрессия в unique.data.table() с data.table 1.12.0

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

# 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

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

Спасибо за обстоятельный отчет!

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

Спасибо за обстоятельный отчет!

Спасибо @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 а, ладно, имеет смысл! Спасибо, что посмотрели и разъяснили сообщение об ошибке.

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