【问题标题】:Rhtml: Warning: conversion failure on '<var>' in 'mbcsToSbcs': dot substituted for <var>Rhtml:警告:“mbcsToSbcs”中“<var>”的转换失败:用点代替 <var>
【发布时间】:2012-11-06 13:03:12
【问题描述】:

环境:

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 日编辑:

@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-->

在我的每个代码的开头。

【问题讨论】:

  • 可能不是你要找的东西,但是在 suppressWarnings 中包装 plot 调用呢
  • 如果没有可重现的示例,我无法测试解决方案。但是,您可以考虑使用 Encoding() 声明您的编码
  • @RomainFrancois 谢谢你的建议。当我不必打印代码时它很有用,但是如果我这样做,封装也是可见的。有没有办法在全球范围内禁止警告?
  • 我能够在 Ubuntu 中重现此问题。我在 Windows 中遇到不同的错误,但类似。编辑您的问题并提供输入文件 (test.Rhtml) 的示例,例如:&lt;!--begin.rcode plot(1:2, main = "šč") end.rcode--&gt; 和类似的命令:library(knitr);knit('test.Rhtml') 以及输出示例,包括:&lt;div class="warning"&gt;&lt;pre class="knitr r"&gt;## Warning: conversion failure on 'šč' in 'mbcsToSbcs': dot substituted for ## &lt;c5&gt;
  • 我相信这个错误与pdf 设备中的问题有关。您可以使用pdf();plot(1:2,main="šč");dev.off() 快速重现错误

标签: r encoding knitr


【解决方案1】:

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

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

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

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

【讨论】:

  • 谢谢,这可能是我至少目前可以使用的最佳解决方案。是否有解决相关问题的计划?例如,pdf() 支持 UTF-8。
  • @HarroldCavendish 查看我在答案中提到的帖子; Ripley 提到 pdf() 不支持 UTF-8,因为底层图形语言不支持 UTF-8。
  • 我已经读过了。那么,是否可以升级底层图形语言呢?这个领域是否有任何正在进行的发展?请原谅我对这个话题缺乏经验。
  • @HarroldCavendish 我认为他的意思是 PDF 本身不支持 UTF-8。所以我们必须解决 Adob​​e 的选择。
【解决方案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()放在同一个chunk时,设备已经用默认编码打开了。

在工作解决方案中,当 PDF 设备打开第二个块时,它会从前一个块中的设置继承编码;这就是它正确生成字符的方式。

如果您不想在每个 Rhtml 文件中设置此编码选项,您可以将其放在 ~/.Rprofile 中,这样它会影响您所有的 PDF 设备。或者您定义自己的函数来编织 Rhtml 文件,例如

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

然后knit2('yourfile.Rhtml')

【讨论】:

  • 感谢您的解释。我的意思是在您的 R 会话中运行 pdf.options(encoding='ISOLatin2.enc'),而不是将其包含在 .Rhtml 文件中。我认为这与将其放入您的~/.Rprofile 基本相同。
  • 另外,我想知道让knitr 捕捉这些警告并提出解决方案是否有意义。您仍然可以输出警告,但添加一条提示“您可能想尝试pdf.options(encoding='x')”的小消息。
  • 自动推荐pdf.options()听起来不错,但是这里很难确定x(编码对我来说是个难题)。我想我能做的就是把它变成一个常见问题解答。
  • 嗯,您也许可以将人们指向grDevices/inst/enc/ 目录并告诉他们找到正确的编码文件。
  • 是的,我可以按照您的建议列出可能的编码。我的意思是我不确定哪种编码是正确的。谢谢!
【解决方案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()

【讨论】:

  • 非常感谢,这也可以,但是不如@nograpes 解决方案方便。
猜你喜欢
  • 1970-01-01
  • 2020-07-05
  • 2019-10-21
  • 2014-09-20
  • 2011-07-13
  • 2020-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多