Подтвердить что ты не робот

Почему некоторые символы Юникода отображаются в матрицах, но не в кадрах данных в R?

По крайней мере в некоторых случаях азиатские символы печатаются, если они содержатся в matrix или vector, но не в data.frame. Вот пример

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] "天"

Очевидно, что мое устройство способно отображать символ, но когда оно находится в data.frame, оно не работает.

Сделав некоторое копание, я обнаружил, что функция print.data.frame выполняет format для каждого столбца. Оказывается, если вы запускаете format.default напрямую, возникает одна и та же проблема:

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

Копаем в format.default, я нахожу, что он вызывает внутренний format, написанный на C.

Прежде чем я буду копать дальше, я хочу знать, могут ли другие воспроизвести это поведение. Есть ли какая-то конфигурация R, которая позволила бы мне отображать эти символы в data.frame s?

My sessionInfo(), если это помогает:

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
4b9b3361

Ответ 1

Я ненавижу отвечать на свой вопрос, но, хотя комментарии и ответы помогли, они были не совсем правы. В Windows не похоже, что вы можете установить общий язык "UTF-8". Однако вы можете установить локальные страны, которые будут работать в этом случае:

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

Но мне действительно интересно, почему именно format использует locale; Интересно, есть ли способ игнорировать локаль в Windows. Я также задаюсь вопросом, существует ли какой-то общий UTF-8 локаль, о котором я не знаю в Windows.

Ответ 2

Я просто писал о Unicode и R несколько дней назад. Я думаю, что ваш редактор R - это UTF-8, и это дает вам иллюзию, что R в вашей Windows обрабатывает символы UTF-8.

Короткий ответ - это когда вы хотите обработать Юникод (здесь, это китайский), не используйте английскую Windows, используйте китайскую версию Windows или Linux, которая по умолчанию является UTF-8.

Информация о сеансе в моем 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