Org Babel における R ソースコードブロック
Org Babel で R を使用すると、統計計算、データ分析、グラフィックス生成、再現可能な研究論文のための環境が提供されます。Org Mode の R コードブロックは ESS(Emacs Speaks Statistics) と統合され、インタラクティブな実行、マルチブロック間の状態共有、出版品質のグラフィックス、構造化テーブル出力をサポートします。
1. セットアップと環境設定
1.1 前提条件
- 動作する R のインストール(CRAN バイナリまたはソースからのビルド)。
- MELPA からインストールした ESS(Emacs Speaks Statistics)(セッションベースの評価とステッピングに必要)。
org-babel-load-languagesでob-Rを有効化。
1.2 Emacs 設定テンプレート
以下を init.el に追加します:
;; 1. MELPA の設定
(require 'package)
(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t)
(package-initialize)
;; 2. ESS のロードを確認
(unless (package-installed-p 'ess)
(package-refresh-contents)
(package-install 'ess))
(require 'ess-r-mode)
;; 3. Org Babel で R を有効化
(org-babel-do-load-languages
'org-babel-load-languages
'((emacs-lisp . t)
(R . t)))
;; 4. オプション:インタラクティブなセキュリティ確認プロンプトなしでブロックを実行
(setq org-confirm-babel-evaluate nil)
1.3 Windows 固有の設定
Microsoft Windows で、Emacs が The system cannot find the path specified と報告する場合、R バイナリのパス(デフォルトの Babel フラグ --slave --no-save を含む)を明示的に設定します:
;; 64ビット Windows の場合:
(setq org-babel-R-command "C:/Progra~1/R/R-4.3.0/bin/x64/R --slave --no-save")
注: :session を使用する場合、org-babel-R-command は無視され、代わりに ESS の inferior-ess-R-program が使用されます。
2. 実行モード:セッションと ESS 統合
2.1 非セッション(:session none、デフォルト)
個別のバッチ R プロセス(R --slave --no-save)で実行されます。クリーンで分離されており、副作用はありませんが、毎回すべてのライブラリとデータのロードを再実行します。
2.2 インタラクティブセッション(:session <名前>)
内部の ESS R プロセス(*<名前>*)内で実行されます。
- データセット、ライブラリ、モデル、変数は、同じセッション名を共有する複数のブロック間で永続化されます。
- インタラクティブな検査、デバッグ、高速な反復ワークフローが可能になります。
#+PROPERTY: header-args:R :session *r-analysis* :results value :exports both
2.3 ESS を使用したインタラクティブなデバッグとステッピング
R ブロックのトラブルシューティング時:
- セッションに切り替え: R ブロック内にポイントがある状態で、
M-<down>(org-babel-pop-to-session)またはC-c C-z(ess-switch-to-end-of-ESS)を押して R REPL バッファにジャンプします。 - 環境を検査:
ls()、str(x)、dim(x)、summary(x)、head(x)を使用します。 - 1行ずつステップ実行:
- Org ブロック内で
C-c '(org-edit-special)を押して、専用の ESS R バッファに入ります。 C-c C-n(ess-eval-line-and-step)またはC-c C-c(ess-eval-region-or-function-or-paragraph)を使用して、ライブの R プロセスでコードを 1 行ずつステップ実行します。C-c 'を押して Org ドキュメントに戻ります。
- Org ブロック内で
3. 結果の処理:データフレーム、値、テーブル
3.1 表形式データの返却(:results value table)
データフレーム、行列、ベクトルを返す場合、Org Babel はそれらを直接ネイティブの Org テーブルに変換します:
#+NAME: mtcars_summary
#+BEGIN_SRC R :session *r* :results value table :colnames yes
aggregate(mpg ~ cyl + gear, data=mtcars, FUN=mean)
#+END_SRC
#+RESULTS: mtcars_summary
| cyl | gear | mpg |
|-----+------+------------------|
| 4 | 3 | 21.5 |
| 6 | 3 | 19.7500000000000 |
| 8 | 3 | 15.0500000000000 |
| 4 | 4 | 26.92 |
| 6 | 4 | 19.75 |
| 4 | 5 | 28.2 |
| 6 | 5 | 19.7 |
| 8 | 5 | 15.4 |
- データフレームを扱う場合は、列名を正しく保持して表示するために、常に
:colnames yesを追加します。 - R では、最後に評価された式の値が自動的に返されます(明示的な
return()は不要です)。
3.2 コンソール出力のキャプチャ(:results output)
:results output を使用して、標準出力、モデルの表示、要約統計量をキャプチャします:
#+BEGIN_SRC R :session *r* :results output
fit <- lm(mpg ~ wt + hp, data=mtcars)
summary(fit)$coefficients
#+END_SRC
#+RESULTS:
: Estimate Std. Error t value Pr(>|t|)
: (Intercept) 37.2272694 1.59878754 23.284688 2.565459e-20
: wt -3.8778307 0.63273349 -6.128695 1.119647e-06
: hp -0.0317729 0.00902971 -3.518708 1.451229e-03
4. グラフィックスと可視化
4.1 基本グラフィックスのルール(Org $\ge$ 9.3)
グラフィックスを生成するには、:results に file と graphics の両方 を指定し、さらに :file で出力ファイル名を指定します:
:results graphics file :file <パス.拡張子>
サポートされているファイル拡張子と対応する R デバイス:
- ベクター:
.pdf、.svg、.ps/.postscript、.tex(TikZ) - ラスター:
.png、.jpg/.jpeg、.tiff、.bmp - デフォルトのフォールバック:
.png
#+BEGIN_SRC R :file figures/base_plot.png :results graphics file :width 600 :height 400 :res 120
plot(mtcars$wt, mtcars$mpg, pch=19, col="darkblue",
xlab="Weight (1000 lbs)", ylab="Miles per Gallon",
main="Fuel Economy")
abline(lm(mpg ~ wt, data=mtcars), col="red", lwd=2)
#+END_SRC
#+RESULTS:
[[file:figures/base_plot.png]]
4.2 重要な ggplot2 / Lattice 「グリッドグラフィックス」のルール
落とし穴: Lattice(xyplot)と ggplot2 の関数はグラフィカル オブジェクト を返します。非インタラクティブなバッチ評価(非セッション)では、オブジェクトを表示せずに返すと、空または壊れたグラフィックスファイルが作成されます!
Org Babel で ggplot2 / Lattice プロットをレンダリングするには、3つの信頼できる方法 があります:
方法 A:明示的な print()(非セッション推奨)
#+BEGIN_SRC R :file figures/dist.png :results graphics file
library(ggplot2)
p <- ggplot(mtcars, aes(x=mpg)) + geom_histogram(bins=10, fill="steelblue")
print(p) # 明示的な print() がグラフィックスデバイスのレンダリングをトリガー
#+END_SRC
方法 B::session を使用(インタラクティブに自動表示)
#+BEGIN_SRC R :session *r* :file figures/dist.png :results graphics file
library(ggplot2)
ggplot(mtcars, aes(x=mpg)) + geom_histogram(bins=10, fill="steelblue")
#+END_SRC
方法 C::results output graphics file を使用
#+BEGIN_SRC R :file figures/dist.png :results output graphics file
library(lattice)
xyplot(mpg ~ wt, data=mtcars)
#+END_SRC
5. R グラフィックスデバイスのヘッダー引数
Org Babel は、R グラフィックスデバイス(png()、pdf()、svg() など)のパラメーターに直接マッピングするファーストクラスのヘッダー引数を提供します:
| ヘッダー引数 | デフォルト値 | 説明と使用可能な値 |
|---|---|---|
:width | 7 (in) / 480 (px) | デバイスの幅。 |
:height | 7 (in) / 480 (px) | デバイスの高さ。 |
:units | px(ラスター)、in(PDF) | 単位:"px"、"in"、"cm"、"mm"。 |
:res | 72 | 1インチあたりのピクセル数(DPI)による公称解像度。(鮮明なラスタープロットには不可欠:150〜300を使用)。 |
:bg | "white" | 背景色(例:"transparent"、"#f7f7f7")。 |
:fg | "black" | 前景色。 |
:pointsize | 12 | テキストレンダリングの基本ポイントサイズ。 |
:family | "Helvetica" | フォントファミリー("Helvetica"、"Times"、"Palatino"、"Courier"、"sans"、"serif"、"mono")。 |
:quality | 75 | JPEG 品質パーセンテージ(1〜100)。 |
:type | プラットフォームデフォルト | ビットマップレンダラー:"cairo"、"quartz"、または "Xlib"。 |
:paper | "special" | PDF 用紙サイズ:"special"、"a4"、"letter"、"a4r" など。 |
:R-dev-args | nil | デバイス関数に直接渡される追加の R デバイス引数の raw 文字列。 |
例:カスタム寸法の高 DPI Cairo SVG/PNG
#+NAME: custom_styled_plot
#+HEADER: :width 8 :height 5 :units in :res 300 :type cairo
#+HEADER: :R-dev-args bg="#fcfcfc"
#+BEGIN_SRC R :session *r* :file figures/styled_plot.png :results graphics file
library(ggplot2)
ggplot(diamonds[1:1000, ], aes(x=carat, y=price, color=cut)) +
geom_point(alpha=0.6) +
theme_minimal(base_family="sans") +
labs(title="Diamond Prices by Carat and Cut")
#+END_SRC
5.3 ドキュメントフォントに合わせる TikZ LaTeX グラフィックス
軸ラベルや数式注釈がドキュメントと同じ LaTeX フォントを正確に共有するプロットを生成するには:
#+BEGIN_SRC R :file figures/model_plot.tex :results graphics file
plot(1:10, type="b", main="\\textbf{TikZ Plot with Math: } $\\int_0^1 x^2 dx$")
#+END_SRC
LaTeX/PDF にエクスポートすると、.tex ファイルは \input{figures/model_plot.tex} によってネイティブにインクルードされます!
6. 高度なフォーマット出力(ASCII、Org、LaTeX)
6.1 ascii パッケージを使用したフォーマット済み Org 出力
R パッケージ ascii は、複雑な非表形式の R オブジェクト(describe()、table()、summary() など)をネイティブの Org 構文に変換できます:
#+BEGIN_SRC R :session *r* :results output org
library(ascii)
options(asciiType = "org")
tab <- table(mtcars$cyl, mtcars$gear)
ascii(tab, caption="Cylinders vs Forward Gears")
#+END_SRC
#+RESULTS:
#+BEGIN_ORG
#+CAPTION: Cylinders vs Forward Gears
| | 3 | 4 | 5 |
|---+----+---+---|
| 4 | 1 | 8 | 2 |
| 6 | 2 | 4 | 1 |
| 8 | 12 | 0 | 2 |
#+END_ORG
6.2 LaTeX エクスポート用の xtable を使用した出版用テーブル
LaTeX エクスポートを介して PDF を対象とするドキュメントの場合、:results output latex と共に xtable を使用します:
#+BEGIN_SRC R :results output latex :exports results
library(xtable)
fit <- lm(mpg ~ wt + hp, data=mtcars)
print(xtable(summary(fit), caption="Regression Estimates", label="tab:reg"),
comment=FALSE)
#+END_SRC
#+RESULTS:
#+BEGIN_LaTeX
\begin{table}[ht]
\centering
\begin{tabular}{rrrrr}
\hline
& Estimate & Std. Error & t value & Pr($>$$|$t$|$) \\
\hline
(Intercept) & 37.2273 & 1.5988 & 23.28 & 0.0000 \\
wt & -3.8778 & 0.6327 & -6.13 & 0.0000 \\
hp & -0.0318 & 0.0090 & -3.52 & 0.0015 \\
\hline
\end{tabular}
\caption{Regression Estimates}
\label{tab:reg}
\end{table}
#+END_LaTeX
7. トラブルシューティングとよくある落とし穴
| 問題 | 原因 | 解決策 |
|---|---|---|
| ggplot2 や lattice が空白または破損した画像を生成する | 非セッションモードで返されたグラフィックスオブジェクトが明示的に表示されなかった | プロットを print(p) でラップするか、:session に切り替えるか、:results output graphics file に output を追加する。 |
| グラフィックスファイルは生成されるがリンクが挿入されない | file または graphics キーワードが欠落している | ヘッダーに :results graphics file(Org $\ge$ 9.3 では両方の単語が必要)があることを確認する。 |
The system cannot find the path specified(Windows) | R 実行可能ファイルが PATH またはカスタムの場所に見つからない | init.el で (setq org-babel-R-command "path/to/R --slave --no-save") を設定する。 |
| R データフレームで列が 0 行に変換される | テーブルの列ヘッダーが観測データとして扱われる | ブロックヘッダー引数に :colnames yes を追加する。 |
| セッション内の R が大規模計算でハングする | ブロックが Emacs プロセスをブロックしている | 内部の ESS バッファ(C-c C-z)に切り替えて進行状況を監視するか、C-c C-c で中断する。 |
| エクスポートされたドキュメントでプロットがぼやける | デフォルトのラスター DPI(72)が低すぎる | :res 300 を追加し、それに応じて :width と :height を調整する。 |