Sweave

R+LaTeXで「文芸的プログラミング」しようと思ったら,R標準のSweave(エスウィーブ)か,最近流行のknitr(ニッター)を使う。ここではSweaveを説明する。

このページを書いたきっかけは,2013年度統計数理研究所共同研究集会「データ解析環境Rの整備と利用」(2013-11-29)で,R Core TeamでSweaveなどをメンテしておられるMurdoch先生に直々にいろいろ教えていただいたことである。詳しくは当日の資料 Reproducible Research を参照されたい。

「文芸的プログラミング」って何?

TeXの作者Knuthが考えたプログラミング方法論。詳しくは Literate Programming という本を参照されたい。有沢誠先生による邦訳 文芸的プログラミング は絶版のようである。

うんと簡単にいえば,ドキュメントの中にコードを含め,ドキュメントとしてもコードとしても使えるようにする方法。Knuthはこの実装の一つとして1983年に「WEB」を書き,それでTeXを再実装した。ちなみに「WEB」は「Web」(World Wide Web)より早い。

このWEBを再実装したものがRamsey(1989)の Noweb であり,それをS(後のR)の世界に持ち込んだものがLeisch(2002)の Sweave である。

Sweaveについては Ihaka (2009): ``Customizing Sweave to Produce Better Looking LaTeX Output'' が非常に参考になる。Ihakaの Papers and Talks のページから得られる。

ちなみに,Bracken(2009)の cameronbracken/pgfSweave というものがあったが,現在メンテナンスされていない。

インストール

Rにはもともと入っているので何もする必要はない。

TeX側では,Rに同梱されているSweave.styを入れる必要がある。Mac版Rならば

/Library/Frameworks/R.framework/Resources/share/texmf/tex/latex/

の下にあるものを例えば texmf-local/tex/latex/R/ を作ってそこにコピーするか,シンボリックリンクする:

cd /usr/local/texlive/texmf-local/tex/latex (例えば)
ln -s /Library/Frameworks/R.framework/Resources/share/texmf/tex/latex ./R

texmf-local 以下を変更した場合は mktexlsr コマンドを忘れないように。

Sweaveの例

次のファイルを作り,foo.Rnw(またはfoo.Snw)という名前でUTF-8で保存する。拡張子の nw は上記 noweb が起源らしい。

\documentclass{jsarticle}
\begin{document}

一様乱数を5個作って平均する。
<<>>=
x = runif(5)
x
mean(x)
@
\end{document}

Rのコンソールで次のように打ち込む:

Sweave("foo.Rnw", encoding="utf-8")

あるいは,次のように(たとえ不要でも)入力がUTF-8であることがわかる行を書いておけば自動判断される:

\documentclass{jsarticle}
\usepackage[utf8]{inputenc}
\begin{document}
……

これで foo.tex が生成されるので,platex + dvipdfmx でPDFにする。platex の代わりに uplatex を使う場合は1行目を \documentclass[uplatex]{jsarticle} にすればよい。

いろいろ

Ihaka(上記参照)の推奨(例えば *.Rnw の \begin{document} の直後に入れる):

\DefineVerbatimEnvironment{Sinput}{Verbatim} {xleftmargin=2em}
\DefineVerbatimEnvironment{Soutput}{Verbatim}{xleftmargin=2em}
\DefineVerbatimEnvironment{Scode}{Verbatim}{xleftmargin=2em}
\fvset{listparameters={\setlength{\topsep}{0pt}}}
\renewenvironment{Schunk}{\vspace{\topsep}}{\vspace{\topsep}}

日本語なら,左マージンは全角幅(zw)の整数倍にしたい。また,jsarticleの本文行送りは日本語なので広めにしているが,Rコードの行送りは少し減らしたい:

\fvset{xleftmargin=2zw,baselinestretch=0.75}

Last modified: