Data.table: DT[TRUE] dapat menyebabkan kunci tidak valid

Dibuat pada 13 Des 2018  ·  4Komentar  ·  Sumber: Rdatatable/data.table

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.

  • [x] #3214
  • [ ] #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.

bug

Komentar yang paling membantu

Ya, setkey, mengubah kolom yang ada tidak boleh digunakan pada salinan dangkal karena kolom itu sendiri tidak disalin.

Semua 4 komentar

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)
Apakah halaman ini membantu?
0 / 5 - 0 peringkat