Rhtml:警告:'mbcsToSbcs'中'<var>'的转换失败:dot替换<var> </var> </var>

时间:2012-11-06 13:03:12

标签: r encoding knitr

环境:

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"

目的:

从R HTML(.Rhtml)文件生成HTML文件,其中包含带有扩展拉丁字符的图,例如š或č。

问题:

当我点击编织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,它会以相同的方式竖起),现在我确实没有希望。

2012年11月9日编辑:

使用@metasequoia建议的Encoding()的解决方案确实有效,但考虑到打印代码的需要,最好没有该功能,我更喜欢@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-->

在我的每个代码的开头。

3 个答案:

答案 0 :(得分:6)

@metasequoia的答案有效,但我想补充几点。如果将PDF选项设置为其他编码,则无需在Encoding中包装所有输出文本。在点击编织HTML

之前运行此操作
pdf.options(encoding='ISOLatin2.enc')

Ripley在a post here中讨论了编码问题,特别是与PDF相关的问题,可能会引起人们的兴趣。值得注意的是,这种错误在Windows上不会以相同的方式发生,因为编码是以完全不同的方式处理的。

其他语言可能需要不同的编码文件,但这似乎适用于斯洛伐克语。

答案 1 :(得分:5)

只是解释一下你找到的解决方案:

<!--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')

答案 2 :(得分:2)

使用@nograpes可重现的近似示例(Mac OSX上的R 2.15.1):

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

我能够复制OP的错误代码。用Encoding()包装“šč”消除了警告消息。

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