Warum unterstützt R data.table nicht gut für Nicht-ASCII-Schlüssel unter Windows?

8

Nun, ich habe eingereicht das Problem auf Github aber keine Antwort bekommen. data.table ist ein großartiges R-Paket, das uns bei der täglichen Arbeit sehr hilft.

Nach der Version 1.9.6 unterstützt es jedoch plötzlich keine Nicht-ASCII-Schlüssel in Windows, wenn die Spalte nicht in UTF-8 codiert ist (die Standard-Nicht-ASCII-Zeichencodierung in R hängt von der Plattform ab) .

Es ist höchstwahrscheinlich ein Fehler (und ein großer Fehler, würde ich sagen). Ich bin überrascht, dass niemand die Aufmerksamkeit auf diese bezahlt und es ist niemand zu beschweren, da der Fehler seit fast 2 Jahren existiert.

Ich habe stundenlang versucht, das Problem zu lösen, ist aber gescheitert. Die entsprechenden Commits sind Ссылка und Ссылка

Sie versuchen tatsächlich andere Codierung Zeichen in UTF-8 zu konvertieren, dann sortieren und vergleichen Sie alle Zeichen in UTF-8. Es scheint, als wäre die Handhabung der Codierung korrekt. Ich vermute jedoch, dass der Bug dort versteckt ist. Die Umsetzung data.table ist wirklich komplex, ich frage, ob jemand so helfen kann, dass wir eine PR machen können diese nach unten zu regeln.

Vielen Dank.

Minimal reproducible example

Datensatz

%Vor%

Scheitert (gibt NA zurück), wenn die Kodierung nativ ist

%Vor%

Wird nur erfolgreich sein, wenn die Codierung in utf8

konvertiert wird

Jetzt gibt es die richtige Antwort 1 zurück. Beachten Sie, dass die Reihenfolge der dt auch jetzt anders wird, was nicht passieren soll.

%Vor%

sessionInfo

%Vor%     
Shrek Tan 01.12.2017, 19:06
quelle

1 Antwort

7

Ich beantworte meine eigene Frage, um es zu schließen, da dieses Problem in PR gelöst wurde.

Bei Zeichenfolgen vergleicht data.table ihre Werte in der UTF8-Codierung. Aufgrund der fehlenden zwei ENC2UTF8 in csort() und csort_pre() hängt die Reihenfolge, die data.table erstellt, jedoch von der Codierung ab. Unter Windows führt die Tatsache, dass die Standardcodierung nicht UTF8 ist, zu seltsamen Ausgaben, wenn es Strings in Schlüsseln gibt.

Um diesen Fall zu debuggen, müssen Sie wissen, wie Sie die Nicht-ASCII-Zeichen aus der C-Routine in die Ausgabe von R ausgeben. Wenn Sie Rprintf() direkt verwenden, erhalten Sie ein Durcheinander. Sie müssen translateChar() für die Zeichenfolge zuerst verwenden.

Referenzen:

Shrek Tan 17.01.2018 16:54
quelle

Tags und Links