...

LYXでSweaveを使う

by user

on
Category: Documents
23

views

Report

Comments

Transcript

LYXでSweaveを使う
LYX で Sweave を使う
Yihui Xie∗
Gregor Gorjanc
Jean-Marc Lasgouttes
2012 年 8 月 25 日
Sweave は、文芸的プログラミングの考えに従った、動的なレポート生成するための、R 言語 (http://
www.r-project.org) ツールです。R コードは、LATEX 文書の中で混用することができ、文書がコン
パイルされるときに R で実行されます。結果は、TEX 出力内に書きこまれます。
LYX 2.0 以降、Sweave モジュールを使えば、どの文書クラスでも、特別な設定なしに Sweave を使
うことができるようになりました。したがって、以前のように、設定ファイルを手動で変更したり、
literate-article.layout や literate-book.layout のような特別なレイアウトを追加したりすることは、も
う必要なくなりました。Sweave モジュールは、文書 ▷ 設定 ▷ モジュールで LYX 文書に追加できます。
この取扱説明書では、Sweave の標準的な機能を例示し、このモジュールがどのように動作するかを
説明します。この取扱説明書の PDF 版は、https://github.com/downloads/yihui/lyx/sweave.
pdfにあります。
1
システム要件
Sweave モジュールは、実行ファイル Rscript に依存しますので、このファイルが、システムの
PATH 変数に含まれるパスになくてはなりません。これは、Linux や Mac OS ユーザーには大した
問題とならないでしょうが、Windows ユーザーには混乱を招くかもしれません。Windows におけ
る PATH が何かわからない場合には、R 言語のリポジトリhttps://github.com/yihui/lyxにある
R スクリプト add-R-path-win.R を使って、パスを自動的に変更するか (推奨はできません。何にせよ
PATH が何かくらいは勉強すべきです)、あるいはツール ▷ 設定 ▷ パス ▷ パス接頭辞から R のバイナ
リパスを追加することができます (推奨)。後者の場合、大抵 C:\Program Files\R\R-x.x.x\bin のよう
な形となり、R 内部では下記のようになります。
> R.home('bin')
これらの変更を加えた後、ツール ▷ 再初期設定を使って、LYX の再設定を行う必要があります。
Rscript が PATH にない場合、Sweave モジュールを使うことはできません。Sweave の更新は続いて
いますので、最新版の R を使用することをお勧めします。R に同梱され、このパス下にある (CTAN
にはありません)LATEX スタイルファイル Sweave.sty によって、下記のように依存関係が追加されます。
> file.path(R.home('share'), 'texmf', 'tex', 'latex')
MikTEX ユーザーは、MikTEX の設定で、MikTEX のルートディレクトリ一覧に texmf ディレクト
リも追加したほうが良いかもしれません。また、Sweave.sty は fancyvrb パッケージに依存しており、
ae に依存することもあります。LYX が Sweave.sty を検出できないときは、直接 R からコピーします
ので、このスタイルファイルがどこにあるかわからない場合でも、Sweave モジュールは動作します。
∗ アイオワ州立大学統計学部、電子メール:
[email protected]
1
2 Sweave の用例
Sweave 文書を書く前に、Sweave オプションを設定しましょう。Sweave の設定コマンドは \SweaveOpts{}
であり、LYX 文書中で、挿入 ▷ 任意設定差込枠 ▷ Sweave オプションか、TEX コードで書く (挿入 ▷ TEX
コード) ことで挿入することができます。例えば、すべての R コードを抑制するために、文頭で大域
オプション echo=FALSE を設定することもできます (既定では、R コードとその出力は、LATEX 文書
中に表示されます)。
LYX で R コードを書くには、まずレイアウト様式一覧 (ツールバーの左上端のドロップリスト) か
ら、コード組 (chunk) 環境に変更するか、あるいは、単に TEX コード環境を開いて、Sweave のコー
ド組を書き込んでください。後者の方法の方が安定していますので、そちらをお勧めします。
例えば width や useFancyQuotes のような R オプションも Sweave の出力に便利です。前者のオ
プションは、出力の幅を調整するものであり、後者は引用符に関してよく起こる問題を回避すること
ができます。詳細については、R に添付の Sweave 取扱説明書をお読みください。
> ## オプション「digits」は桁数 (の概数) を設定できます
> options(width = 70, useFancyQuotes = FALSE, digits = 4)
> ## Sweave の vignette を見る (要 R >= 2.13.0)
> vignette("Sweave", package = "utils")
下記は、どの S エンジンでも動作する単純な例です。
> ## 1 から 10 までの整数は
> 1:10
[1]
1
2
3
4
5
6
7
8
9 10
> ## results=hide を設定して意図的に出力を隠す
> print(1:20)
単純な計算機をエミュレートすることもできます。
> 1 + pi
[1] 4.142
> sin(pi/6)
[1] 0.5
今度は、ガウシアンデータを見てみましょう。
# 再現可能性のため
> set.seed(123)
> x <- rnorm(20)
> print(x)
[1] -0.56048 -0.23018 1.55871 0.07051
[8] -1.26506 -0.68685 -0.44566 1.22408
[15] -0.55584 1.78691 0.49785 -1.96662
0.12929 1.71506
0.35981 0.40077
0.70136 -0.47279
> t1 <- t.test(x)
2
0.46092
0.11068
表 1: iris データの最初の 4 変数の分位数
Sepal.Length Sepal.Width Petal.Length Petal.Width
0%
25%
4.30
5.10
2.00
2.80
1.00
1.60
0.10
0.30
50%
75%
5.80
6.40
3.00
3.30
4.35
5.10
1.30
1.80
100%
7.90
4.40
6.90
2.50
> pairs(iris, col = iris$Species)
図 1: iris データの散布図マトリックス
数値を標準テキストに簡単に統合させることができます。これは、\Sexpr{} コマンドによって行
われ、LYX 中の対応するメニューは挿入 ▷ 任意設定差込枠 ▷ S/R 表現ですが、TEX コードを使うこと
もできます。例えば、ベクトル x の第 3 要素は、1.55870831414912 (すなわち x[3]) であり、検定の
p 値は 0.52 です。これらの数値は、R 中で round() のようなコマンドを使うことによって丸めること
もできます。
今度は、iris データセットの要約を見てみましょう。
> summary(iris[,-5])
Sepal.Length
Min.
:4.30
Sepal.Width
Min.
:2.00
Petal.Length
Min.
:1.00
Petal.Width
Min.
:0.1
1st Qu.:5.10
Median :5.80
1st Qu.:2.80
Median :3.00
1st Qu.:1.60
Median :4.35
1st Qu.:0.3
Median :1.3
Mean
:5.84
3rd Qu.:6.40
Max.
:7.90
Mean
:3.06
3rd Qu.:3.30
Max.
:4.40
Mean
:3.76
3rd Qu.:5.10
Max.
:6.90
Mean
:1.2
3rd Qu.:1.8
Max.
:2.5
通常、人々はこのような「生の」出力を好みませんので、これらのごちゃごちゃした数字を、xtable
パッケージを使って綺麗にしてやるといいでしょう。表1は、Sweave での xtable パッケージの使い
方を示すための例です。コード組のオプション results=tex は、R 出力が、特別な環境 (Soutput)
で包まれるのではなく、生の LATEX コードとして書き出されるように保証するためのものです。
図1と図2は、Sweave を使って画像を生成する簡単な例です。
Sweave 文書中の R コードは、単一の R スクリプトとして書きだすことができますが、これは R
CMD Stangle を使って行われます。
> par(mar = c(4, 5, 0.1, 0.3), las = 1)
> boxplot(Sepal.Length ˜ Species, data = iris, horizontal = TRUE,
+
xlab = "Sepal.Length")
図 2: 種でグループ化された萼片の長さのボックスプロット
3
3
Sweave モジュール
Sweave モジュールは、LYX 文書が、R を使った文芸的プログラミングのコンポーネントを含んでい
ることを宣言しますので、LYX は、そのような文書を取り扱う特定の変換子を使って処理します (取
扱説明書カスタマイズ篇参照)。Sweave モジュールは、sweave 変換子を使用しますが、これは、LYX
の scripts ディレクトリ下にある R スクリプト lyxsweave.R が本体になっています。このスクリプト
は、LYX から Rnw 文書を受け取り、これを TEX 文書に変換するために Sweave を呼び出します。そ
の後の作業は、LYX が面倒を見ます。
sweave 形式から LATEX への変換子は、下記のコマンド行で R を呼び出します。
Rscript --no-save --no-restore $$s/scripts/lyxsweave.R $$p$$i $$p$$o $$e $$r
LYX ライブラリディレクトリ$$s は、ヘルプ ▷ LYX についてメニューに記載があります。他に R に
渡すことのできるオプションは、R スクリプト中で説明されており、また、LYX 取扱説明書カスタマ
イズ篇には、$$i・$$o・$$e・$$r についての詳しい説明があります。一般ユーザーは、これらの意
味について詳しく知る必要はありませんが、ここでは、R コードにまつわる若干の問題について説明
しておく必要があります。
1. LYX 文書のエンコーディングを表す文字列は、R にコマンドラインオプションとして渡されま
す。取り得る値は、ISO-8859-15 や UTF-8 などです。エンコーディングは、R が Rnw 文書を
正しく読むのに使用されます。
2. Sweave 文書内の R コード塊は、LYX 文書のあるディレクトリで実行されます (自信のない場
合は、現在の作業ディレクトリがどこかを見るために、コード塊に getwd() を置いてくださ
い)。この場合、データファイルは同じディレクトリ下に置くことができ、再現可能性を保証す
るために、R 内部では相対パスを使用してください。すなわち、他のシステムでは存在しない
かもしれない、ハードコードのパスを書く必要はありません。
3. LATEX が Sweave.sty を検出できないと、この R スクリプトが自動的に Sweave.sty を一時ディレ
クトリにコピーし、そこで LATEX コンパイルを実行します。
4. Sweave は、既定で Rnw ファイルのファイル名を、画像出力の接頭辞文字列として使用しま
す。既知の問題の 1 つ (#7551) として、ファイル名 (拡張子を除く) にピリオドが含まれている
場合、LATEX がそのファイルを \includegraphics{} で処理する際に失敗しうるということが
知られています。したがって、接頭辞の既定値は、すべてのピリオドを「-」で置換したファイ
ル名にしてあります。この問題は、Sweave で直接的に解決することもができます。Sweave オ
プションの prefix.string を、ピリオドを含まない文字列に設定すると、このオプションが
既定値を上書きします。
Sweave パッケージには、事前に noae オプションが設定されています。このオプションは、Sweave
が下記の 2 つのパッケージを読み込んでしまうのを防ぎます。
\RequirePackage[T1]{fontenc}
\RequirePackage{ae}
LYX は、既定でフォントエンコーディングを取り扱うことができるので、Sweave にこれをやって
もらう必要はないのです (その上、これはパッケージオプションの衝突をもたらす可能性があります)。
一方、ユーザーは、必要ならばプリアンブルで ae パッケージを手動で読み込ませることができます。
4
4
問題の解決法
LYX 2.0 以降、コンパイル中の詳細な情報を、表示 ▷ メッセージを表示で見ることができるように
なりました。これは、問題の解決に非常に役に立ちます。R の処理は、メッセージパネルに表示さ
れ、エラーが発生した場合には、どのコード組がおかしいのか知ることができます。例えば、この文
書をコンパイルする時、以下のようなメッセージを見ることができるでしょう。
17:58:47.868: Processing code chunks with options ...
17:58:47.885: 1 : echo keep.source term verbatim (label=setup)
17:58:47.889:
17:58:47.908:
2 : echo keep.source (label=sweave-manual)
3 : echo keep.source term verbatim (label=print-integers)
....
17:58:47.941: Loading required package: xtable
17:58:47.976: 9 : echo term verbatim pdf (label=iris-pairs)
....
17:58:48.116: You can now run (pdf)latex on 'sweave.tex'
label=の後の文字列が、コード組のラベルを示します。コード組のどれかが R でエラーを起こせ
ば、即座にここにエラーメッセージを見ることができます。
もうひとつ知られている問題点は、LYX 中でコード組段落の配置に (段落設定を使用して) 手を加
えた場合、LYX は、改行しないでコード組の前に \centering{} のようなマクロを書き加えてしまう
ことがあるので、Sweave コード組がエラーを起こす場合があるという事です。この場合のコード組
は、下記のようになってしまいます。
\centering{}<<xtable-demo,results=tex,echo=FALSE>>=
<<>>=は行頭すぐに置かれなくてはならないため、これは正しい Sweave コードではありません。
したがって、コード組段落の配置に手を加える場合には、表示 ▷ ソースを表示で、実際のソースコー
ドを再確認し、<<>>=が改行後に現れるようにすることをお勧めします。表1のコード組に手動で空
行が追加されているのは、このためです。
5
リソース
Sweave のホームページは、http://www.stat.uni-muenchen.de/˜leisch/Sweave/にあります。
The CRAN task view on 「Reproducible Research」にある CRAN タスクビューには、便利と
思われる Sweave 関連パッケージの一覧があります。http://cran.r-project.org/web/views/
ReproducibleResearch.htmlをご覧ください。LYX と Sweave に関する質問は、LYX メーリング
リスト (http://www.lyx.org/MailingLists) に投稿してください。さらに多くの LYX の用例は、
https://github.com/yihui/lyxにあります。
6 FAQ
6.1 Sweave を beamer で使うにはどうすればよいでしょうか
beamer のスライドで Sweave を使うと、LYX では LATEX エラーが発生します。その理由は、生の
R コードや R 出力を含む beamer フレームには、fragile オプションを付けなくてはならないため
5
です。しかしながら、現在のところ、これを行う率直な方法はありません。方法として考えられる
のは、生の TEX コードを書くか、#7273で議論されているように beamer-fragile.module を使うかです
(このファイルを LYX ユーザーディレクトリの layouts ディレクトリ下に置き、LYX を再初期設定し
てください)。このモジュールをお使いの文書に取り込んだ後、挿入 ▷ 任意設定差込枠 ▷ FragileFrame
を選択すれば、\begin{frame}[fragile] を挿入することになります。
6.2 Rnw 文書をコンパイルするための R スクリプトを書いてもいいですか
もちろんです。まず、前述の R スクリプト$$s/scripts/lyxsweave.R がどのように動作するかを理
解する必要がありますので、できればその R ソースコードを読むことをお勧めします (特に、R が
パスをどのように取得し、Rnw 文書を取り扱うのに Sweave() をどのように使っているかを見てくだ
さい)。その後、カスタマイズした lyxsweave.R をあなたのユーザーディレクトリ (ヘルプ ▷ LYX につ
いてでチェックできます) の scripts ディレクトリ下に置いてください。LYX は自身のライブラリディ
レクトリを見に行く前にユーザーディレクトリをチェックしますので、R スクリプト lyxsweave.R が
ユーザーディレクトリで検出されれば、それが使用されます。LYX ライブラリディレクトリ下にある
スクリプトを直接ハックしてしまうと、LYX 更新時に修正したスクリプトが上書きされてしまいます
(ユーザーディレクトリは影響を受けません) ので、お勧めしません。
なお、R の公式 Sweave の他に、Sweave の代替ツールである knitr パッケージもサポートされて
おり、対応するモジュール名は Rnw (knitr) となっています。
6
Fly UP