Ответ 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))