#
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
感谢您的详尽报告!
谢谢@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好吧,有道理! 感谢您查看并澄清错误消息。
最有用的评论
感谢您的详尽报告!