Comments
Description
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