Data.table: 从 data.table 1.12.0 开始,unique.data.table() 中的回归

创建于 2019-01-30  ·  3评论  ·  资料来源: Rdatatable/data.table

# Minimal reproducible example

我相信版本 1.12.0 中的data.table相对于 1.11.8 有一个回归。 TL;博士

我认为unique.data.table()的实现已经改变,新的实现不支持列中的列表等复杂类型。

uptasticsearch的一些用户报告说从我们的代码中收到一条错误消息,如下所示:

forderv(x, by = by, sort = FALSE, retGrp = TRUE) 中的错误:
by= (2) 的第 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) 中的错误:
by= (2) 的第 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

一旦我安装了 v 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 (2018-04-23)
平台: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] stats graphics grDevices utils datasets methods base

通过命名空间加载(未附加):
[1] compiler_3.5.0 tools_3.5.0 yaml_2.2.0 data.table_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>
> 

我将在 NEWS 中添加一些内容,并对错误消息提出建议...

@mattdowle好吧,有道理! 感谢您查看并澄清错误消息。

此页面是否有帮助?
0 / 5 - 0 等级