2012-07-06 2 views
7

У меня есть куча названий авторов из-за рубежа в CSV, который R читает в полном порядке. Я пытаюсь очистить их для загрузки в Mechanical Turk (что действительно не нравится даже одному интернационализированному персонажу). При этом, у меня есть вопрос (будет размещена позже), но я не могу даже dput их в разумный путь:Как правильно транслировать интернационализированный текст?

> dput(df[306,"primauthfirstname"]) 
"Gwena\xeblle M" 
> test <- "Gwena\xeblle M" 
<simpleError in nchar(val): invalid multibyte string 1> 

Другими словами, dput работает просто отлично, но вставив результат дает сбой , Почему не dput выводит необходимую информацию, чтобы разрешить копирование/вставку обратно в R (предположительно все, что нужно сделать, это добавить атрибуты кодировки в оператор структуры?). Как мне это сделать?

Обратите внимание, что \xeb является допустимым символом, насколько R обеспокоен:

> gsub("\xeb","", turk.df[306,"primauthfirstname"]) 
[1] "Gwenalle M" 

Но что вы не можете оценить символы по отдельности - это шестнадцатеричный код \ х ## или ничего:

> gsub("\\x","", turk.df[306,"primauthfirstname"]) 
[1] "Gwena\xeblle M" 
+3

Это отлично работает для меня: '(test <-" Gwena \ xeblle M ")' дает '[1]« Gwenaëlle M »'. Я использую R 2.14.0 с 'LANG = en_US.UTF-8'. –

+0

@MichaelHoffman Что такое 'LANG'? Как это проверить? –

+0

Это переменная среды. Попробуйте 'Sys.getenv (« LANG »)'. Какую версию R вы используете? –

ответ

1

В справочной странице dput() говорится: «Записывает текстовое представление ASCII объекта R». Поэтому, если ваш объект содержит символы, отличные от ASCII, они не могут быть представлены и должны быть каким-то образом преобразованы.

Поэтому я бы предложил использовать iconv() для преобразования вашего вектора перед dput ing. Один из подходов:

> test <- "Gwena\xeblle M" 
> out <- iconv(test, from="latin1", to="ASCII", sub="byte") 
> out 
[1] "Gwena<eb>lle M" 
> gsub('<eb>', 'ë', out) 
[1] "Gwenaëlle M" 

который, как вы видите, работает в обоих направлениях. Позднее вы можете использовать gsub() для обратного преобразования байтов в символы (если ваша кодировка поддерживает его, например, utf-8).

Второй подход является более простым (и я предполагаю, что предпочтительнее для ваших нужд), но работает в одну стороны, и ваш libiconv не может поддержать его:

> test <- "Gwena\xeblle M" 
> iconv(test, from="latin1", to="ASCII//TRANSLIT") 
[1] "Gwenaelle M" 

Надеется, что это помогает!

Смежные вопросы