【问题标题】:R: how to make sure R CMD BATCH does not produce non-ASCII characters?R:如何确保 R CMD BATCH 不会产生非 ASCII 字符?
【发布时间】:2019-01-17 18:19:54
【问题描述】:

在包的tests 部分,我通常在一些xxx.R 文件上运行R CMD BATCH,这会创建一个xxx.Rout.save。问题是失败的all.equal() 将创建非ASCII 字符。这会在稍后运行R CMD check 时产生错误:

比较‘xxx.sim.Rout’和‘xxx.sim.Rout.save’

-"组件\"short.run\":平均相对差:0.2180449"

-“组件'short.run':平均相对差:0.2180449”

这是因为 all.equal() 创建了非 ASCII 字符:

> tools::showNonASCII(all.equal(list(a=1), list(a=2)))
Component <e2><80><9c>a<e2><80><9d>: Mean relative difference: 1

似乎R CMD check 正在运行xxx.R 脚本,其选项与我在运行R CMD BATCH 时使用的选项不同...请注意,R 扩展指南说:

请注意,比较将在最终用户的语言环境中进行, 因此,如果可能,目标输出文件应该是 ASCII。

但不清楚如何确保R CMD BATCH 以 ASCII 格式创建输出?我试过了,R CMD BATCH --encoding=ASCII 但它仍然会创建一个非 ASCII 文件!?

cat("all.equal(list(a=1), list(a=2))", file ="xxx.R")
system("R CMD BATCH --encoding=ASCII xxx.R xxx.Rout")
tools::showNonASCIIfile("xxx.Rout")
file.remove(c("xxx.R", "xxx.Rout"))

确实给了:

"分量a:平均相对差:1"

【问题讨论】:

    标签: r encoding r-package rscript


    【解决方案1】:

    避免该问题的一种方法是更改​​all.equal() 中的引号。事实证明all.equal() 使用dQuote() 作为引号,是否使用花哨的引号,取决于options()$useFancyQuotes

    最简单的方法是关闭它(顺便说一句,Windows 默认关闭):

    options(useFancyQuotes=FALSE)
    

    其实使用默认的TRUE就是自找麻烦,看文档:

    适当引号的选择取决于 语言环境和可用的字符集。 较旧的 Unix/X11 字体 显示重音(ASCII 代码 0x60)和撇号(0x27) 在某种程度上,它们也可以用作匹配打开和关闭 单引号。使用现代字体或非 Unix 系统,这些 字符不再产生匹配的字形。 Unicode 提供左 和右单引号字符(U+2018 和 U+2019);如果 不能假定 Unicode 标记可用,看起来不错 练习使用撇号作为无方向的单引号 标记。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-27
      • 1970-01-01
      相关资源
      最近更新 更多