Data.table: Regresi di unique.data.table() pada data.table 1.12.0

Dibuat pada 30 Jan 2019  ·  3Komentar  ·  Sumber: Rdatatable/data.table

# Minimal reproducible example

Saya yakin telah terjadi regresi di data.table di versi 1.12.0 relatif terhadap 1.11.8. TL;DR

Saya pikir implementasi unique.data.table() telah berubah dan implementasi baru tidak mendukung tipe kompleks seperti daftar di kolom.

Beberapa pengguna uptasticsearch telah melaporkan menerima pesan kesalahan dari kode kami yang terlihat seperti ini:

Kesalahan dalam forderv(x, by = by, sort = FALSE, retGrp = TRUE):
Kolom 2 dari oleh= (2) adalah tipe 'daftar', belum didukung

Setelah menyelidiki malam ini, saya menemukan sumber masalah dan dapat mereproduksinya. Saya percaya perilaku unique() telah berubah dan saya akan menganggap perubahan itu sebagai regresi.

Pada 1.12.0:

someDT <- data.table::data.table(
    col1 = 1:2,
    col2 = list(list(TRUE, FALSE), list(FALSE, TRUE))
)
unique(someDT)

Meningkatkan kesalahan

Kesalahan dalam forderv(x, by = by, sort = FALSE, retGrp = TRUE):
Kolom 2 dari oleh= (2) adalah tipe 'daftar', belum didukung

Untuk menurunkan versi ke rilis sebelumnya, saya menjalankan yang berikut dari baris perintah:

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

Setelah saya menginstal v 1.11.8, saya menjalankan ulang kode R di atas

someDT <- data.table::data.table(
    col1 = 1:2,
    col2 = list(list(TRUE, FALSE), list(FALSE, TRUE))
)
unique(someDT)

Bekerja seperti yang diharapkan dan kembali:

   col1   col2
1:    1 <list>
2:    2 <list>

Jadi saya menyalahkan unique.data.table() untuk melihat apa yang memiliki . berubah. Sepertinya tidak ada perubahan substantif yang dibuat antara 1.11.8 dan sekarang, jadi saya berpikir untuk melihat kesalahan forderv() .

Saya juga tidak melihat sesuatu yang berarti dalam kesalahan forderv() .

Saya memutuskan untuk mencoba satu hal lagi...mencari teks "belum didukung" (dari pesan kesalahan). Itu membawa saya ke forder.c , yang kesalahannya membawa saya ke #3124.

Sejauh yang saya tahu, PR ini adalah sumber masalah di atas. Tidak ada deskripsi tentang PR jadi saya tidak yakin apakah ini efek samping yang tidak diinginkan atau regresi yang diketahui yang akan diperbaiki dalam rilis data.table mendatang.

# Output of sessionInfo()

R versi 3.5.0 (2018-04-23)
Platform: x86_64-apple-darwin15.6.0 (64-bit)
Berjalan di bawah: macOS High Sierra 10.13.6

Produk matriks: default
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

lokal:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

paket dasar terlampir:
[1] statistik grafik grDevices utils datasets metode dasar

dimuat melalui namespace (dan tidak dilampirkan):
[1] compiler_3.5.0 tools_3.5.0 yaml_2.2.0 data.table_1.12.0

Komentar yang paling membantu

Terima kasih atas laporan menyeluruhnya!

Semua 3 komentar

Terima kasih atas laporan menyeluruhnya!

Terima kasih @jameslamb! Di 1.11.8, Anda juga mendapatkan kesalahan jika keunikan tidak diselesaikan sebelum kolom 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

Dalam contoh itu saya mengubah col1 untuk mengandung duplikat, sehingga col2 kemudian diperlukan untuk menentukan keunikan.

v1.12.0+ memeriksa jenis semua kolom di depan sebelum memulai algoritme. Melakukan pemeriksaan ini di awal membuat segalanya lebih mudah secara internal untuk paralelisme.

Untuk membuatnya berfungsi dan mengecualikan kolom list , gunakan argumen by= untuk menentukan (mungkin) beberapa kolom pertama. Karena unik pada kolom list tidak berfungsi, saya pikir mungkin lebih baik dipaksa untuk menjadi eksplisit, daripada tiba-tiba terkejut dengan kesalahan nanti ketika dups terjadi di non- list kolom.

> unique(DT, by="col1")
    col1   col2
1:     1 <list>
> 

Saya akan menambahkan sesuatu ke NEWS dan saran untuk pesan kesalahan ...

@mattdowle ah ok, masuk akal! Terima kasih telah melihat dan mengklarifikasi pesan kesalahan.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat