8

我正在使用 knitr 1.1。在 R 3.0.0 和 WinEdt (RWinEdt 2.0) 中。我在 knitr 识别瑞典语字符(ä、ö、å)时遇到问题。这不是 R 的问题;这些字符甚至可以在文件名、目录名、对象等中识别。在 Sweave 中也不是问题。

我的文档中已经有\usepackage[utf8]{inputenc},但 knitr 似乎无法处理特殊字符。运行 knitr 后,我收到以下消息:

Warning in remind_sweave(if (in.file) input) :
It seems you are using the Sweave-specific syntax; you may need Sweave2knitr("deskriptiv 130409.Rnw") to convert it to knitr

processing file: deskriptiv 130409.Rnw

(*) NOTE: I saw chunk options "label=läser_in_data"
please go to http://yihui.name/knitr/options (it is likely that you forgot to 
quote "character" options)

Error in parse(text = str_c("alist(", quote_label(params), ")"), srcfile = NULL) : 
1:15: unexpected input
1: alist(label=lä
                 ^
Calls: knit ... parse_params -> withCallingHandlers -> eval -> parse
Execution halted

它抱怨的特定标签是 label=läser。更改标签是不够的,因为如果 R 对象使用 äåö,knitr 甚至会抱怨。

我使用了 Sweave2knitr(),因为该文件最初是为 Sweave 创建的,但结果并不好:现在所有 äåö 都已转换为 äpåö,无论是在 R 块中还是在乳胶文本中,并且 knitr 仍然给出一条错误消息。

会话信息:

R version 3.0.0 (2013-04-03)
Platform: i386-w64-mingw32/i386 (32-bit)

locale:
[1] LC_COLLATE=Swedish_Sweden.1252  LC_CTYPE=Swedish_Sweden.1252           LC_MONETARY=Swedish_Sweden.1252
[4] LC_NUMERIC=C                    LC_TIME=Swedish_Sweden.1252    
attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     
other attached packages:
[1] knitr_1.1
loaded via a namespace (and not attached):
[1] digest_0.6.3   evaluate_0.4.3 formatR_0.7    stringr_0.6.2  tools_3.0.0   

正如我提到的,有些文件名和对象带有瑞典语字符(因为以前这不是问题),而且文本也需要使用瑞典语。

感谢您帮助 knitr 在英语以外的地方工作。

4

2 回答 2

3

我认为如果您使用此模式调用knitr. knit()问题是如果您不使用操作系统的本机编码,WinEdt 必须将文件的编码传递给。您提到UTF-8了但这不是 Windows 的本机编码,因此\usepackage[utf8]{inputenc}除非您确定您的文件是 UTF8 编码的,否则不得使用。

这里混合了几个问题,不可能用一个答案来解决所有问题。

第一个问题是label=läser,应该是label='läser',即你必须引用所有的块标签(也检查文档中的其他标签);knitr尝试在您编写时自动引用您的标签<<foo>>=(它变为<<'foo'>>=),但这在您使用时不起作用<<label=foo>>=(您必须<<label='foo'>>=明确编写)。但是这个问题在这里可能不是必需的。

我认为这里真正的问题是文件编码(在 Windows 下很讨厌)。您似乎在默认情况下UTF-8不尊重的系统下使用。UTF-8在这种情况下,您可以调用knit('yourfile.Rnw', encoding = 'UTF-8'),即将编码传递给knit(). 我不使用 WinEdt,所以我不知道该怎么做。您可以在配置中对编码进行硬编码,但不建议这样做。

两个建议:

  1. 请勿UTF-8在 Windows 下使用;改用您的系统本机编码(Windows-1252我猜);
  2. 或者使用 RStudio 代替 WinEdt,它可以将编码传递给knitr

BTW,既然Sweave2knitr()弹出了,你的Rnw文件肯定有其他问题。要诊断问题,有两种方法:

  1. 如果你使用UTF-8,运行Sweave2knitr('deskriptiv 130409.Rnw', encoding = 'UTF-8')
  2. 如果您使用操作系统的本机编码,只需运行Sweave2knitr('deskriptiv 130409.Rnw')

如果您对由 打印的诊断信息有任何疑问,请阅读文档Sweave2knitr()

于 2013-04-10T18:23:42.820 回答
2

R-Sweaveknitr通过knitr.edt宏调用,它本身使用代码 knitrSweave.R来启动 knit。后面这个脚本中的knit命令靠近顶部,显示为res <- knit(filename).

按照 Yihui 的建议,您可以尝试将此命令替换为

res <- knit(filename, encoding = 'UTF-8')

knitr.edtknitrSweave.R文件应该在您的文件%b\Contrib\R-Sweave夹中,%b您的 winEdt 用户文件夹在哪里(类似于"C:\Users\userA\AppData\Roaming\WinEdt Team\WinEdt 7"Win 7 下的文件)。

目前,我不知道我们如何将编码作为参数传递以避免这种硬编码解决方案。

我建议避免文件名中的扩展字符,这只会成为问题的根源。就个人而言,我从不使用这样的名字。

于 2013-04-13T12:49:56.940 回答