#
Minimal reproducible example
バージョン1.12.0では1.11.8と比較してdata.table
に回帰があったと思います。 TL; DR
unique.data.table()
の実装が変更され、新しい実装は列のリストなどの複雑な型をサポートしていないと思います。
uptasticsearchの一部のユーザーは、次のようなエラーメッセージをコードから受け取ったと報告しています。
forderv(x、by = by、sort = FALSE、retGrp = TRUE)のエラー:
by =(2)の列2はタイプ 'list'であり、まだサポートされていません
今夜調査したところ、問題の原因を突き止め、再現することができました。 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はタイプ 'list'であり、まだサポートされていません
以前のリリースにダウングレードするために、コマンドラインから次のコマンドを実行しました。
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()のせいにも意味のあるものは何も見当たりませんでした。
もう1つ試してみることにしました...「まだサポートされていません」というテキストを検索します(エラーメッセージから)。 それが私を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]統計グラフィックgrDevicesutilsデータセットメソッドベース
名前空間を介してロードされます(接続されていません):
[1] compiler_3.5.0tools_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ああ、わかりました、理にかなっています! ご覧いただき、エラーメッセージを明確にしていただきありがとうございます。
最も参考になるコメント
徹底的な報告ありがとうございます!