DT[TRUE]
が浅いコピーを実現する方法だとは思いませんでした。 浅いコピーは、内部使用のみを目的としていました。 #3214および関連する#2254でこれを強調してくれた@ renkun-kenに感謝します。
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に追加され、これが修正されたときに備えています。
はい、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)
最も参考になるコメント
はい、setkey、列自体はコピーされないため、既存の列の変更はシャローコピーでは使用しないでください。