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
コマンドを忘れないように。
次のファイルを作り,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: