Saya tidak menyadari DT[TRUE]
adalah cara untuk mendapatkan salinan yang dangkal. salinan dangkal hanya ditujukan untuk penggunaan internal. Terima kasih kepada @renkun-ken untuk menyoroti ini di #3214, dan terkait #2254.
Di v1.11.8 kita melihat ini:
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
Itu hanya terjadi setelah DT[TRUE]
, iiuc, yang mudah-mudahan tidak terlalu banyak ditemukan atau diandalkan orang?! Saya harap penggunaan di luar sana seperti yang dijelaskan @renkun-ken untuk menambahkan kolom baru ke salinan dangkal, bukan untuk mengubah kolom yang ada!
Tes baru 1542.08 telah ditambahkan di PR #2313 siap ketika ini diperbaiki.
Ya, setkey, mengubah kolom yang ada tidak boleh digunakan pada salinan dangkal karena kolom itu sendiri tidak disalin.
Jika kami tidak mengizinkan untuk membuat salinan dangkal dengan dt[TRUE]
masalah ini akan diselesaikan secara otomatis.
Akhirnya. Tetapi sementara itu, kami tidak dapat merusak alur kerja @renkun-ken.
Lebih detail di sini: https://github.com/Rdatatable/data.table/issues/3214#issuecomment -462490046
kode berikut dapat ditambahkan ke pengujian untuk memastikan perilaku penyalinan
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)
Komentar yang paling membantu
Ya, setkey, mengubah kolom yang ada tidak boleh digunakan pada salinan dangkal karena kolom itu sendiri tidak disalin.