2.1 レンダリング時に何が起こっているのか
R Markdown はいくつかの異なるプロセスを合わせて文書を作成しています. これが R Markdown の全てのパーツがどう連動してるか理解するのに混乱する主な元凶です.9 幸運にも, ユーザーが文書を作成できるようになるためにはこれらの処理の内部の挙動を全て理解することは必須ではありません. しかし, 文書の挙動を変えようとするだろうユーザーにとっては, どのパーツがどの挙動を担当しているかを理解することは重要です. あなたが検索する適切な範囲を絞れるようになれば, ヘルプを探すのがより簡単になります.
R Markdown 文書に対する基本的なワークフローの構造を図2.1に示します. ステップ (矢印) と, 出力ファイルが生成される前に作成される中間ファイルを強調しています. 全ての処理は rmarkdown::render()
関数内に実装されています. 以降は各ステップを詳細に説明します.
.Rmd
文書は, 文書の本来の形式です. YAML (メタデータ), テキスト (ナラティブ), コードチャンク を含んでいます.
最初に knitr (Xie 2021d) の knit()
関数が .Rmd
ファイルに埋め込まれた全てのコードを実行し, 出力文書に出力コードを表示します. 全ての結果は, 一時的に作られた .md
ファイルに含まれるよう, 適正なマークアップ言語へと変換されます.
その後 .md
ファイルは, あるマークアップ言語のファイルから別のものへと変換するための多用途なツールである Pandoc によって処理されます. Pandoc は文書の YAML フロントマターで指定された何らかのパラメータ (例: title
, author
, date
) を受け取り, 文書を output
パラメータで指定された出力フォーマット (HTML へ出力する html_document
のような) へ変換します.
出力フォーマットが PDF ならば, さらに処理が1層追加され, Pandoc が中間ファイルの .md
を もう一つの中間ファイル .tex
に変換します. このファイルはその後, 最終的な PDF 文書を形成するため LaTeX によって処理されます. 1.2 節で話したように, rmarkdown パッケージは tinytex パッケージ (Xie 2022) の latexmk()
関数を呼び出し, これが次々に LaTeX を呼び出して .tex
をコンパイルし .pdf
にします.
簡潔にまとめると, rmarkdown::render()
= knitr::knit()
+ Pandoc (PDF の場合のみ + LaTeX) ということです.
Robin Linacre が https://stackoverflow.com/q/40563479/559676 で R Markdown と knitr と Pandoc の関係について良い要約を書いてくれました. この投稿には上記の概観よりも技術的に細かい話も含まれています.
全ての R Markdown 文書が常に Pandoc を通してコンパイルされるわけではないことに注意してください. 中間ファイル .md
は他の Markdown レンダラによってもコンパイルできます. 例えば2つ例を挙げます.
xaringan パッケージ (Xie 2021f) は出力された
.md
をウェブブラウザ上で Markdown コンテンツを表示するための JavaScript ライブラリに渡します.10blogdown パッケージは (Xie, Dervieux, and Presmanes Hill 2022)
.Rmarkdown
文書形式をサポートし,.Rmarkdown
を knit して.markdown
にします. 通常であれば, Markdown 文書は外部のサイトジェネレータによって HTML にレンダリングされます.
参考文献
Allison Horst が R Markdown の処理を魔法になぞらえたすばらしいイラストに描き出してくれました (https://github.com/allisonhorst/stats-illustrations/raw/master/rstats-artwork/rmarkdown_wizards.png). そして, この絵はまさに本書の扉絵に使われました.↩︎
訳注: xaringan について日本語で言及している例は少ないですが, 次のページが用法・技術的な説明の両面で優れています. https://qiita.com/nozma/items/21c56c7319e4fefceb79↩︎