Почему некоторые символы Юникода отображаются в матрицах, но не в кадрах данных в 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
Ответы
Ответ 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