2012-02-29 75 views
5

我使用R 2.14.0在Mac OS X 10.7.3上使用Emacs 24。我有一个文件foo.RnwEmacs,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")) 

这解决了这个问题。

+0

如果您确定所有文档都以UTF8编码,您可以在'〜/ .Rprofile'中使用'Sys.setlocale()'(尽管我不太推荐这么做)。编码问题很棘手。我想知道我的knitr包在这种情况下的表现如何(我没有Mac,所以我不知道)。 – 2012-02-29 20:06:26

+0

非常感谢Yihui。正如你从上面的** UPDATE **中可以看到的,这解决了这个问题。 – 2012-02-29 22:17:35

+0

@MariusHofert:即使现在已经解决了:Sweave(“foo.Rnw”,encoding =“utf8”)'help? – cbeleites 2012-05-22 12:48:30

回答

0

最终答案可以在UPDATE找到。

@cbeleites:我不再运行Mac OS X(既不是R 2-14),所以我不能说。