knitr中的非英语特殊字符

时间:2013-04-10 13:13:10

标签: r utf-8 character-encoding special-characters knitr

我正在使用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在英语之外工作。

2 个答案:

答案 0 :(得分:3)

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

这里有几个问题混在一起,只用一个答案就不可能解决所有问题。

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

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

两个建议:

  1. 不要在Windows下使用knit();使用您的系统本机编码(我猜是UTF-8);
  2. 或使用RStudio而不是WinEdt,它可以将编码传递给Windows-1252;
  3. 顺便说一句,由于弹出了knitr,因此您的Rnw文档中肯定存在其他问题。要诊断问题,有两种方法:

    1. 如果您使用Sweave2knitr(),请运行UTF-8
    2. 如果您使用操作系统的原生编码,只需运行Sweave2knitr('deskriptiv 130409.Rnw', encoding = 'UTF-8')
    3. 即可

      如果您对Sweave2knitr('deskriptiv 130409.Rnw')打印出的诊断信息有疑问,请阅读documentation

答案 1 :(得分:2)

R-Sweave通过knitr宏调用knitr.edt,该宏本身使用knitrSweave.R中的代码启动编织。此后一个脚本中的knit命令位于顶部附近,并显示res <- knit(filename)

根据Yihui的建议,您可以尝试用

替换此命令
res <- knit(filename, encoding = 'UTF-8')

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

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

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