Data.table: الانحدار في unique.data.table () اعتبارًا من data.table 1.12.0

تم إنشاؤها على ٣٠ يناير ٢٠١٩  ·  3تعليقات  ·  مصدر: Rdatatable/data.table

# Minimal reproducible example

أعتقد أنه كان هناك انحدار في data.table في الإصدار 1.12.0 بالنسبة إلى 1.11.8. TL ؛ DR

أعتقد أن تطبيق unique.data.table() قد تغير وأن التطبيق الجديد لا يدعم الأنواع المعقدة مثل القوائم في الأعمدة.

أبلغ بعض مستخدمي uptasticsearch عن تلقي رسالة خطأ من الكود الخاص بنا والتي تبدو كالتالي:

خطأ في forderv (x، by = by، Sort = FALSE، retGrp = TRUE):
العمود 2 لـ by = (2) من النوع "list" ، غير مدعوم حتى الآن

بعد التحقيق الليلة ، وجدت مصدر المشكلة ويمكنني إعادة إنتاجها. أعتقد أن سلوك unique() قد تغير وأعتقد أن هذا التغيير هو انحدار.

في 1.12.0:

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

يثير الخطأ

خطأ في forderv (x، by = by، Sort = FALSE، retGrp = TRUE):
العمود 2 لـ by = (2) من النوع "list" ، غير مدعوم حتى الآن

للرجوع إلى الإصدار السابق ، قمت بتشغيل ما يلي من سطر الأوامر:

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

بمجرد تثبيت الإصدار 1.11.8 ، قمت بإعادة تشغيل كود R أعلاه

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

يعمل كما هو متوقع ويعود:

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

لذلك ذهبت إلى اللوم على unique.data.table () لمعرفة ما كان. تغير. يبدو أنه لم يتم إجراء تغييرات جوهرية بين 1.11.8 والآن ، لذلك فكرت في إلقاء اللوم على forderv() .

لم أر أي شيء ذي معنى في إلقاء اللوم على forderv () أيضًا.

قررت أن أجرب شيئًا آخر ... البحث عن النص "غير مدعوم بعد" (من رسالة الخطأ). قادني ذلك إلى forder.c ، الذي قادني اللوم إلى # 3124.

بقدر ما أستطيع أن أقول ، هذا العلاقات العامة هو مصدر المشكلة أعلاه. لا يوجد وصف في PR لذلك لست متأكدًا مما إذا كان هذا تأثيرًا جانبيًا غير مقصود أو انحدارًا معروفًا سيتم إصلاحه في إصدار مستقبلي data.table .

# Output of sessionInfo()

R الإصدار 3.5.0 (2018-04-23)
النظام الأساسي: x86_64-apple-darwin15.6.0 (64 بت)
يعمل تحت: macOS High Sierra 10.13.6

منتجات ماتريكس: الافتراضي
BLAS: /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
الثغرة: /Library/Frameworks/R.framework/Versions/3.5/Resources/lib/libRlapack.dylib

المكان:
[1] en_US.UTF-8 / en_US.UTF-8 / en_US.UTF-8 / C / en_US.UTF-8 / en_US.UTF-8

الحزم الأساسية المرفقة:
[1] احصائيات رسومات grDevices وقاعدة طرق مجموعات البيانات

تم تحميلها عبر مساحة اسم (وغير مرفقة):
[1] compiler_3.5.0 tools_3.5.0 yaml_2.2.0 data.table_1.12.0

التعليق الأكثر فائدة

شكرا للتقرير الشامل!

ال 3 كومينتر

شكرا للتقرير الشامل!

شكرا jameslamb! في 1.11.8 ، تحصل أيضًا على الخطأ إذا لم يتم حل التفرد قبل العمود 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

في هذا المثال ، قمت بتغيير col1 لتحتوي على نسخ مكررة ، لذلك هناك حاجة إلى col2 لتحديد التفرد.

v1.12.0 + يتحقق من أنواع جميع الأعمدة في المقدمة قبل بدء الخوارزمية. يؤدي إجراء هذا الفحص مقدمًا إلى تسهيل الأمور داخليًا للتوازي.

لجعلها تعمل واستبعاد أعمدة list ، استخدم الوسيطة by= لتحديد (ربما) الأعمدة القليلة الأولى. نظرًا لأن الأعمدة الفريدة في list لم تعمل على أي حال ، أعتقد أنه من الأفضل أن تُجبر على أن تكون صريحًا ، بدلاً من أن تتفاجأ فجأة بالخطأ لاحقًا عند حدوث عمليات مزيفة في غير list أعمدة

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

سأضيف شيئًا إلى NEWS واقتراحًا لرسالة الخطأ ...

mattdowle آه طيب ، من المنطقي! شكرًا لإلقاء نظرة والتوضيح في رسالة الخطأ.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات