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()