2015-03-25 2 views
14

Я ввел текстовую строку в файл .csv, который включает символы Unicode как: \U00B5 g/dL. В .csv файла, а также прочитать в кадре данных R:Печать символьной строки unicode в R

enter image description here

test=read.csv("test.csv") 

enter image description here

\U00B5 будет производить микро М Sign-. R считывает его в файл данных, как есть (\U00B5). Однако, когда я печатаю строку, она отображается как \\U00B5 g/dL.
В качестве альтернативы, ручной ввод кода работает нормально.

varname <- c("a", "b", "c") 
labels <- c("A \U00B5 g/dL", "B \U00B5 g/dL", "C \U00B5 g/dL") 
df <- data.frame(varname, labels) 
test <- data.frame(varname, labels) 
test 
# varname labels 
# 1  a A µ g/dL 
# 2  b B µ g/dL 
# 3  c C µ g/dL 

Интересно, как я могу избавиться от знака побега \ в этом случае и он распечатает символ. Или, если есть другой способ распечатать символ в R.

Большое спасибо за эту помощь!

+0

Когда вы говорите, * Однако, когда я печатаю строку он показывает, как '\\ U00B5 г/dL'. *, Где вы напечатав строку? –

+0

Спасибо, Ричард, я печатаю его в консоли R. – outboundbird

+1

Мне кажется, что проблема заключается в том, что проблема печати символа юникода невелика, чем о правильном чтении буквального текста в формате Unicode из файла и интерпретации его как строки в Юникоде. –

ответ

27

Хорошо, сначала убедитесь, что определенный символ в R должен быть экранирован, если они находятся за пределами стандартных символов ASCII. Обычно это делается с символом «\». Вот почему вы должны избежать этого персонажа, когда вы пишете строку в R

a <- "\" # error 
a <- "\\" # ok. 

«\ U» является специальным индикатором для Юникода отводящего. Обратите внимание, что в этой строке нет косой черты или U, когда вы используете это экранирование. Это просто ярлык для конкретного персонажа. Примечание:

a <- "\U00B5" 
cat(a) 
# µ 
grep("U",a) 
# integer(0) 
nchar(a) 
# [1] 1 

Это очень отличается от строки

a <- "\\U00B5" 
cat(a) 
# \U00B5 
grep("U",a) 
# [1] 1 
nchar(a) 
# [1] 6 

Обычно при импорте текстового файла, вы бы кодировать не-ASCII символов в любой кодировки используется файл (UTF-8, или Latin-1 являются наиболее распространенными). У них есть специальные байты для представления этих символов. Это не «нормально» для текстового файла, чтобы иметь escape-последовательность ASCII для символов Unicode. Вот почему R не пытается преобразовать «\ U00B5» в символ юникода, потому что он предполагает, что если бы вы хотели использовать символ Юникода, вы бы просто использовали его напрямую.

Самый простой способ повторного перевода ваших значений символа ASCII состоял бы в использовании пакета stringi. Для Примера

library(stringi) 
a <- "\\U00B5" 
stri_unescape_unicode(gsub("\\U","\\u",a, fixed=TRUE)) 

(единственный улов в том, что нам нужно преобразовать «\ U» в более общий «\ и» поэтому функция распознана побег). Вы можете сделать это в импортированных данных с

test$label <- stri_unescape_unicode(gsub("\\U","\\u",test$label, fixed=TRUE)) 
Смежные вопросы