我使用R 2.14.0在Mac OS X 10.7.3上使用Emacs 24。我有一个文件foo.Rnw
含Emacs,R,Sweave:通过Emacs启动Sweave时无法识别UTF-8编码
\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}
我.emacs
与Sweave的工作是这样的:
(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
输出做。我可以包括形式export LC_MESSAGES="en_US.UTF-8"
的陈述中我.bashrc
使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内部工作(这很烦人)。
UPDATE:
我~/.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"
继一辉的建议,我把我的~/.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,所以我不知道)。 – 2012-02-29 20:06:26
非常感谢Yihui。正如你从上面的** UPDATE **中可以看到的,这解决了这个问题。 – 2012-02-29 22:17:35
@MariusHofert:即使现在已经解决了:Sweave(“foo.Rnw”,encoding =“utf8”)'help? – cbeleites 2012-05-22 12:48:30