2013-07-18 14 views
19

Co najmniej w niektórych przypadkach można drukować znaki azjatyckie, jeśli są one zawarte w matrix lub vector, ale nie w data.frame. Oto przykładDlaczego niektóre znaki Unicode są wyświetlane w macierzach, ale nie w ramkach danych w R?

q<-'天' 

q # Works 
# [1] "天" 

matrix(q) # Works 
#  [,1] 
# [1,] "天" 

q2<-data.frame(q,stringsAsFactors=FALSE) 
q2 # Does not work 
#   q 
# 1 <U+5929> 

q2[1,] # Works again. 
# [1] "天" 

Oczywiście, moje urządzenie jest zdolne do wyświetlania znaków, ale gdy jest w data.frame, to nie działa.

Wykonując pewne kopanie, stwierdziłem, że funkcja print.data.frame działa format w każdej kolumnie. Okazuje się, że po uruchomieniu format.default bezpośrednio, ten sam problem występuje:

format(q) 
# "<U+5929>" 

wbijały format.default, uważam, że jest wywołanie wewnętrznej format, napisany w C.

Przed kopać dalej, Chcę wiedzieć, czy inni mogą odtworzyć to zachowanie. Czy jest jakaś konfiguracja R, która pozwoli mi wyświetlić te znaki w ciągu data.frame s?

My sessionInfo(), czy to pomaga:

R version 3.0.1 (2013-05-16) 
Platform: x86_64-w64-mingw32/x64 (64-bit) 

locale: 
[1] LC_COLLATE=English_Canada.1252 LC_CTYPE=English_Canada.1252 
[3] LC_MONETARY=English_Canada.1252 LC_NUMERIC=C     
[5] LC_TIME=English_Canada.1252  

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

loaded via a namespace (and not attached): 
[1] tools_3.0.1 
+1

Spróbuj ustawić "Sys.setlocale (locale =" UTF-8 ")'. To trochę dziwne, że renderowanie jest niespójne; jednak "English_Canada.1252" nie jest w żaden sposób przeznaczony do obsługi znaków azjatyckich. –

Odpowiedz

14

Nienawidzę odpowiedzieć na moje własne pytanie, ale mimo, że komentarze i odpowiedzi pomógł, nie były one całkiem dobrze. W systemie Windows wygląda na to, że nie można ustawić ogólnego ustawienia narodowego "UTF-8". Można jednak ustawić lokalizacje dla poszczególnych krajów, które będą działać w tym przypadku:

Sys.setlocale("LC_CTYPE", locale="Chinese") 
q2 # Works fine 
# q 
#1 天 

Ale to czyni mnie zastanawiać, dlaczego właściwie format wydaje się używać locale; Zastanawiam się, czy istnieje sposób, aby go zignorować ustawienia regionalne w systemie Windows. Zastanawiam się również, czy istnieje jakieś ogólne ustawienie regionalne, którego nie znam w systemie Windows.

+0

Zostawię to na dłużej, zanim sprawdzę własną odpowiedź, jeśli ktoś chce zadzwonić z bardziej szczegółowym wyjaśnieniem tego, co się tutaj dzieje. – nograpes

+0

Po prostu to przewróciłem i według Duncana Murdocha jest to błąd (choć trudny do naprawienia). https://stat.ethz.ch/pipermail/r-devel/2015-May/071252.html –

+0

@RichieCotton Ah!Wiedziałem, że to błąd. Dzięki, że dałeś mi znać. – nograpes

5

Właśnie blogged about Unicode and R kilka dni temu. Wydaje mi się, że edytor R jest UTF-8, a to daje złudzenie, że R w twoim Windowsie obsługuje znaki UTF-8.

Krótka odpowiedź brzmi, gdy chcesz przetworzyć kod Unicode (tutaj, to jest chiński), nie używaj angielskiego systemu Windows, używaj chińskiej wersji systemu Windows lub Linux, która domyślnie to UTF-8.

informacji Session w moim Ubuntu:

> sessionInfo() 
R version 2.14.1 (2011-12-22) 
Platform: i686-pc-linux-gnu (32-bit) 

locale: 
[1] LC_CTYPE=en_US.UTF-8  LC_NUMERIC=C    LC_TIME=en_US.UTF-8  LC_COLLATE=en_US.UTF-8  
[5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 LC_PAPER=C     LC_NAME=C     
[9] LC_ADDRESS=C    LC_TELEPHONE=C    LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C  
+0

@nograpes, W moim Ubuntu i RStudio, nie ma takiego problemu z wyświetlaniem. –

+0

Interesujące. Czy możesz opublikować swoje 'sessionInfo()', aby móc porównywać i kontrastować nasze konfiguracje? – nograpes

+0

Myliłem się, nie mogę odtworzyć problemu w Ubuntu. Jednakże, chociaż to pomaga, nie wyjaśnia, czy istnieje konfiguracja R w systemie Windows, która może rozwiązać problem. – nograpes

Powiązane problemy