Rhtml: Предупреждение: сбой преобразования на '<var>' в 'mbcsToSbcs': точка заменена на <var>

Окружающая среда:

R v. 2.15.1 на Mac OS 10.8.2, платформа x86_64-apple-darwin9.8.0/x86_64 (64-разрядная версия), с RStudio IDE, которая настроена на использование UTF-8 в качестве кодировки по умолчанию. ОС также использует UTF-8.

> Sys.getlocale(category = "LC_ALL")
[1] "sk_SK.UTF-8/sk_SK.UTF-8/sk_SK.UTF-8/C/sk_SK.UTF-8/sk_SK.UTF-8"

Цель:

Создайте HTML файл из файла R HTML (.Rhtml), содержащий график с расширенными латинскими символами, например š или č.

Проблема:

Когда я нажимаю Вязать HTML, вывод выглядит следующим образом:

plot(1:2, main = "šč")
## Warning: conversion failure on 'šč' in 'mbcsToSbcs': dot substituted for
## 
## Warning: conversion failure on 'šč' in 'mbcsToSbcs': dot substituted for
## 
## Warning: conversion failure on 'šč' in 'mbcsToSbcs': dot substituted for
## 
## Warning: conversion failure on 'šč' in 'mbcsToSbcs': dot substituted for
## <8d>
**Plot with correct characters despite the warnings.**

Вопрос:

Что вызывает проблему и как ее решить? Как я могу по крайней мере избавиться от предупреждений, которые отображаются в результирующем файле?

Безупречное примечание:

Я искал решение за последние час или два, нашел много подобных случаев и попробовал много разных потенциальных решений (многие из них связаны с выходом в PDF, который взят таким же образом, если я использую только Sweave), и теперь Я буквально безнадежен.

Редактировать 9 ноября 2012 года:

Решение с использованием Encoding(), предложенное @metasequoia, действительно работает, но, учитывая необходимость распечатки кода, предпочтительно без этой функции, я предпочитаю решение, предоставляемое @nograpes, с помощью функции pdf.options().

Интересно, однако, что пока

<!--begin.rcode
pdf.options(encoding='ISOLatin2.enc')
plot(cars, main="Ťažký")
end.rcode-->

выдает те же предупреждения,

<!--begin.rcode
pdf.options(encoding='ISOLatin2.enc')
end.rcode-->

<!--begin.rcode
plot(cars, main="Ťažký")
end.rcode-->

работает как ожидалось. Почему это? Я думал, что хронология - это все, что имеет значение при запуске команд в R.

Итак, определенное решение для моих целей - положить

<!--begin.rcode echo="FALSE"
pdf.options(encoding='ISOLatin2.enc')
end.rcode-->

в начале каждого из моих кодов.

Ответ 1

Ответ от @metasequoia работает, но я хотел добавить несколько моментов. Если вы установите параметры PDF для другой кодировки, вам не нужно будет обертывать весь текст вывода в Encoding. Запустите это, прежде чем нажимать Вязать HTML:

pdf.options(encoding='ISOLatin2.enc')

Рипли говорит о проблемах с кодировкой, особенно в отношении PDF файлов, в сообщении здесь, и это может представлять интерес. Примечательно, что эта ошибка не будет происходить точно так же в Windows, потому что кодирование обрабатывается совершенно по-другому.

Для других языков может потребоваться другой файл кодировки, но это, похоже, работает для словака.

Ответ 2

Чтобы объяснить найденное решение:

<!--begin.rcode
pdf.options(encoding='ISOLatin2.enc')
end.rcode-->

<!--begin.rcode
plot(cars, main="Ťažký")
end.rcode-->

Это работает, когда он не работает, когда вы помещаете две строки в один и тот же фрагмент, потому что для каждого фрагмента кода knitr открывается новое графическое устройство для записи графиков (по умолчанию это устройство PDF). Слишком поздно устанавливать pdf.options(), потому что устройство было открыто с кодировкой по умолчанию, когда вы помещаете pdf.options() и plot() в один и тот же фрагмент.

В рабочем решении, когда устройство PDF открывается для второго фрагмента, он наследует кодировку из настройки в предыдущем блоке; это то, как он правильно создает символы.

Если вы не хотите устанавливать эту опцию кодирования в каждом из файлов Rhtml, вы можете поместить ее в ~/.Rprofile, чтобы она влияла на все ваши PDF-устройства. Или вы определяете свою собственную функцию для вязания файлов Rhtml, например.

knit2 = function(...) {
   pdf.options(encoding='ISOLatin2.enc')
   knitr::knit(...)
}

Тогда knit2('yourfile.Rhtml').

Ответ 3

Используя @nograpes воспроизводимую аппроксимацию примера (R 2.15.1 на Mac OSX):

pdf()
plot(1:2,main="šč")
dev.off()

Я смог реплицировать код ошибки OP. Обертка "šč" с помощью Encoding() устраняет предупреждающие сообщения.

pdf()
plot(1:2,main=Encoding("šč"))
dev.off()