Emacs、R、Sweave:通过Emacs启动Sweave时无法识别UTF-8编码

5
我在Mac OS X 10.7.3上使用Emacs 24和R 2.14.0。我有一个名为foo.Rnw的文件。
\documentclass[
paper=a4,% 210mm × 297mm
pagesize% write page size to dvi
]{article}

\usepackage[american]{babel}
\usepackage{fancyvrb}

\usepackage[utf8]{inputenc}

\SweaveOpts{engine=R}
\SweaveOpts{pdf=TRUE}

\begin{document}
Some text
<<>>=
sessionInfo()
@
\end{document}

我的用于使用Sweave的.emacs文件如下:
(add-hook 'Rnw-mode-hook
  (lambda ()
    (add-to-list 'TeX-command-list
         '("Sweave" "R CMD Sweave %s"
           TeX-run-command nil t :help "Run Sweave") t)
    (add-to-list 'TeX-command-list
         '("Stangle" "R CMD Stangle %s"
           TeX-run-command nil t :help "Run Stangle") t)
    (setq TeX-command-default "Sweave")))

如果我使用C-c C-c,然后选择Sweave,那么.tex文件看起来像这样:

\documentclass[
NA
pagesize% write page size to dvi
]{article}

\usepackage[american]{babel}
\usepackage{fancyvrb}

\usepackage[utf8]{inputenc}




\usepackage{Sweave}
\begin{document}
Some text
\begin{Schunk}
\begin{Sinput}
> sessionInfo()
\end{Sinput}
\begin{Soutput}
R version 2.14.0 (2011-10-31)
Platform: x86_64-apple-darwin11.2.0/x86_64 (64-bit)

locale:
[1] C

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

loaded via a namespace (and not attached):
[1] tools_2.14.0
\end{Soutput}
\end{Schunk}
\end{document}

如您所见,foo.Rnw 的第二行包含非 ASCII 字符 ×,被替换为 NA。我可以确定这与 R 运行的本地化有关(也可以看到 locale: [1] C 的输出)。我可以在我的 .bashrc 中包含类似于 export LC_MESSAGES="en_US.UTF-8" 的语句,以便 R 获取正确的 locale。我也可以通过终端完美地使用 R CMD Sweave foo.Rnw(当然会加载 .bashrc 并设置正确的 locale)。问题是:如何使它通过 Emacs 工作,以便我可以通过 C-c C-c Sweave 运行 Sweave?我知道 Emacs 不知道在 .bashrc 中设置的变量,但我怎样才能确保从 Emacs 发出的 R CMD Sweave 以与从终端执行时相同的本地化运行?
我发现了几篇针对此问题的帖子,但没有针对 Mac 和 Emacs 内部的解决方案。再次注意,我可以通过终端完美地运行 R CMD Sweave foo.Rnw(由于我在 .bashrc 中的设置),大多数帖子都解决了这个问题,只是在 Emacs 中无法工作(这非常令人恼火)。
更新:
我的 ~/.bashrc 包含:
export LC_COLLATE="en_US.UTF-8"
export LC_CTYPE="en_US.UTF-8"
export LC_MONETARY="en_US.UTF-8"
export LC_TIME="en_US.UTF-8"
export LC_MESSAGES="en_US.UTF-8"

根据Yihui的建议,我在我的~/.Rprofile文件中加入了以下内容:
invisible(Sys.setlocale("LC_COLLATE", "en_US.UTF-8"))
invisible(Sys.setlocale("LC_CTYPE", "en_US.UTF-8"))
invisible(Sys.setlocale("LC_MONETARY", "en_US.UTF-8"))
invisible(Sys.setlocale("LC_TIME", "en_US.UTF-8"))
invisible(Sys.setlocale("LC_MESSAGES", "en_US.UTF-8"))

这解决了问题。

如果您非常确定所有文档都是以UTF8编码的,您可以在~/.Rprofile中使用Sys.setlocale()(尽管我不太建议这样做)。编码问题很棘手。我想知道我的knitr包在这种情况下的表现如何(我没有Mac,所以无法确定)。 - Yihui Xie
非常感谢你,Yihui。正如你可以从我上面的更新中看到的那样,这解决了问题。 - Marius Hofert
@MariusHofert:尽管现在已经解决了:Sweave("foo.Rnw", encoding="utf8")有帮助吗? - cbeleites unhappy with SX
@MariusHofert:您介意回答自己的问题,以便它从“未回答的问题”列表中移除吗? - cbeleites unhappy with SX
1个回答

0

最终答案可以在更新下找到。

@cbeleites:我不再使用Mac OS X(也不再使用R 2-14),所以我无法回答。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接