14

环境:

Mac OS 10.8.2 上的 R v. 2.15.1,平台 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 文件,其中包含带有扩展拉丁字符的绘图,例如 š 或 č。

问题:

当我单击Knit 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 日编辑:

使用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-->

在我的每个代码的开头。

4

3 回答 3

7

只是为了解释您找到的解决方案:

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

于 2012-11-09T16:56:20.150 回答
7

@metasequoia 的答案有效,但我想补充几点。如果将 PDF 选项设置为不同的编码,则无需将所有输出文本包装在Encoding. 在单击Knit HTML之前运行它:

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

Ripley 在这里的一篇文章中谈到了编码问题,尤其是与 PDF 相关的问题,这可能很有趣。值得注意的是,此错误在 Windows 上不会以相同的方式发生,因为编码是以完全不同的方式处理的。

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

于 2012-11-08T23:17:26.657 回答
3

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

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

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

pdf()
plot(1:2,main=Encoding("šč"))
dev.off()
于 2012-11-08T22:48:32.177 回答