关于r:编织物中的非英语特殊字符

Non-english special characters in knitr

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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。更改标签是不够的,因为knitr甚至会抱怨R对象是否使用???。

我使用了Sweave2knitr(),因为该文件最初是为Sweave创建的,但结果并不好:现在全部使用???已在R块和乳胶文本中将其转换为?¤p?¥ ??,并且knitr仍然给出错误消息。

会话信息:

1
2
3
4
5
6
7
8
9
10
11
12
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以外于英语工作而提供的任何帮助。


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

这里混有几个问题,不可能一口气解决所有问题。

第一个问题是label=l?ser,它实际上应该是label='l?ser',即您必须引用所有块标签(也请检查文档中的其他标签); knitr尝试在编写<>=时自动将标签加引号(将其变为<<'foo'>>=),但是在使用<>=时(必须显式编写<>=)这将不起作用。但是这个问题在这里也许不是必需的。

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

两个建议:

  • 在Windows下不要使用UTF-8;改用您的系统本机编码(我猜是Windows-1252);
  • 或者使用RStudio代替WinEdt,后者可以将编码传递给knitr
  • 顺便说一句,由于弹出了Sweave2knitr(),因此您的Rnw文档中肯定还有其他问题。要诊断问题,有两种方法可以解决:

  • 如果使用UTF-8,请运行Sweave2knitr('deskriptiv 130409.Rnw', encoding = 'UTF-8')
  • 如果您使用操作系统的本机编码,则只需运行Sweave2knitr('deskriptiv 130409.Rnw')
  • 如果对Sweave2knitr()打印的诊断信息有疑问,请阅读文档。


    R-Sweave通过knitr.edt宏调用knitr,该宏本身使用knitrSweave.R中的代码启动编织。此更高版本脚本中的knit命令位于顶部附近,并且读取res <- knit(filename)

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

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

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

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

    我建议避免在文件名中使用扩展字符,这只能是问题的根源。就我个人而言,我从未使用过此类名称。