Data.table: DT [TRUE]は無効なキーにつながる可能性があります

作成日 2018年12月13日  ·  4コメント  ·  ソース: Rdatatable/data.table

DT[TRUE]が浅いコピーを実現する方法だとは思いませんでした。 浅いコピーは、内部使用のみを目的としていました。 #3214および関連する#2254でこれを強調してくれた@ renkun-kenに感謝します。

  • [x]#3214
  • []#2254

v1.11.8では、次のようになります。

DT = data.table(id = 1:5, key="id")
DT1 = DT[TRUE]
key(DT1)
[1] "id"
DT1[3, id:=6L]
key(DT1)
# NULL              # correct
DT$id
# [1] 1 2 6 4 5     # should be 1:5
key(DT)
# [1] "id"          # invalid key

それはDT[TRUE] 、iiucの後にのみ発生します。 @ renkun-kenのように、既存の列を変更するのではなく、浅いコピーに新しい列を追加するための使用法があることを願っています。

新しいテスト1542.08がPR#2313に追加され、これが修正されたときに備えています。

bug

最も参考になるコメント

はい、setkey、列自体はコピーされないため、既存の列の変更はシャローコピーでは使用しないでください。

全てのコメント4件

はい、setkey、列自体はコピーされないため、既存の列の変更はシャローコピーでは使用しないでください。

dt[TRUE]浅いコピーを作成できない場合、この問題は自動的に解決されます。

最終的に。 しかし、それまでの間、@ renkun-kenのワークフローを破ることはできません。
詳細はこちら: https

次のコードをテストに追加して、コピーの動作を確認できます

DT = data.table(a=c(1,2), b=c("b","a"))
address(DT)
address(DT[])
address(DT[, .SD])
address(DT[TRUE])
sapply(DT, address)
sapply(DT[], address)
sapply(DT[, .SD], address)
sapply(DT[TRUE], address)
このページは役に立ちましたか?
0 / 5 - 0 評価