Data.table: data.table 1.12.0現在のunique.data.table()の回帰

作成日 2019年01月30日  ·  3コメント  ·  ソース: Rdatatable/data.table

# 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

最も参考になるコメント

徹底的な報告ありがとうございます!

全てのコメント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 評価