Печать символьной строки Unicode в R

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

enter image description here

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

enter image description here

\U00B5 создаст микросигнал. 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

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

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

Ответы

Ответ 1

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

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

"\ U" - специальный индикатор для экранирования unicode. Обратите внимание, что в этой строке нет косой черты или 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" в более распространенное "\ u", чтобы функция правильно распознала escape). Вы можете сделать это с помощью импортированных данных с помощью

test$label <- stri_unescape_unicode(gsub("\\U","\\u",test$label, fixed=TRUE))