knitr ではじめるデータ分析レポート作成 ~基礎編~

  • 28
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。
  • 対象読者
    • knitr でのドキュメント生成は体験済みの方
    • データ分析をやっていてそのレポートを Word などで作るのが面倒くさい方
    • チームで分析をやっていて,データ分析の再現性を共有したい方
  • 記事のゴール
    • ゴール:knitr を基本的に使えるような知識を身に付けて,R での分析結果を HTML として生成できるようになる
  • 前提
    • RStudio をインストール済み

knitr をはじめるにあたっての基礎知識

knitr とは?

knitr パッケージは.R の実行結果をレポートして作成するのに役立つパッケージです.

組織でのデータ分析には,報告書を作成する業務がつきまといます.
たとえば,Word で報告書を作成していてデータ分析結果のプロット図を何百枚も貼り付けているとします.
その途中で分析に誤りがあったり,条件を変更したりするときに,もう一度画像を貼り直す作業をするのは大変です.

knitr では,レポート内容と処理をおなじ1つのファイルで一元管理することができます.
knitr での書き方は,LaTeX や markdown 記法の中で R などの処理を実行してその結果や図をそのまま表示することができます.
このような一元管理の方法は,Donald E. Knuth の「文芸的プログラミング (Literate Programming)」の中でつぎのように述べているようです.

Let us change our traditional attitude to the construction of programs: Instead of imagining that our main task is to instruct a computer what to do, let us concentrate rather on explaining to humans what we want the computer to do.

-- Donald E. Knuth, Literate Programming, 1984

knitr でのドキュメント生成の流れ

R mardkwon ファイルという基本的には markdown 記法で,R の処理とレポートを記述します.
作成した R markdown ファイルを knitr を使って,HTML に変換します.
knitr では,R markdown ファイルを markdown ファイルに変換して,それから HTML に変換します.
この変換をかけるときに,R の処理結果や図を生成して埋め込んでくれます.

  1. Rmd ファイルとして markdown 中に R のソースコードを書き込む
  2. Rmd ファイルを markdown (md) ファイルに変換
  3. markdown ファイルを HTML に変換

Rnw ファイルとして,TeX 記法で同様に R のコードを埋め込んで実行結果を表示することもできます.
Rnw ファイルの方が,R markdown よりもできることが多い(らしい)ですが,今回は記述のしやすい R markdown を対象とします.

markdown 記法とは?

Markdown は,文書を記述するための軽量マークアップ言語のひとつです.
簡単にいえば,HTML に変換できる書きやすて読みやすいプレーンなテキストとして記述できる方法です.
記法例は,wikipedia などにも記載されています.
markdown 記法のドキュメントを変換するコマンドツールとして,markdown, pandoc などがあります.

たとえば,h1, h2, h3 などのヘッダ要素は,つぎのように書きます.
基本的に HTML の要素に対する記法が,提供されています.

    # これは h1 要素
    ## これは h2 要素
    ### これは h3 要素

    *これはイタリック体です*
    _これもイタリック体です_
    **これは太字です**
    __これも太字です__

markdown 記法に R の処理を埋め込む

R markdown

簡単な R markdown の例を,つぎに示します.
ここではみんな大好き iris データの summaryplot の結果を生成するための,R の処理を記述しています.

R として実行したいコードは,コードチャンク (a code chunk) と呼ばれる ```{r}...``` * の間に記述します.
R として実行せず,単純にコードとして記述したいときは \
``...``` とバッククオート3つをブロックとして囲めばよいです.

インラインとして文章中に R の実行結果を埋め込みたいときは,`...` としてバッククオート1つで囲みます.

    # R markdown の簡単な例
    `iris` データの `summary` 関数を適応した結果
    ```\{r eval=FALSE\}
    summary(iris)
    ```
    `iris` データの散布図をプロットした結果
    ```\{r eval=FALSE\}
    plot(iris)
    ```

knitr で生成した HTML の画像キャプチャ

さきの R markdown を実行すると,つぎのような HTML が生成されます.
このようにして,knitr では R の実行結果を含めて HTML としてソースコードと報告内容を一言管理することができます.

また付随して,markdown ファイル(md 拡張子)も生成されていることが確認できるかと思います.
これはファイル生成の流れで説明したとおり,副産物として markdown ファイルができているのが確認できます.

simple-knitr-result.jpg

オプション

knitr のオプションは,大きく分けると2つある.

  1. チャンクオプション
  2. パッケージオプション

チャンクオプションは,個々のチャンク( R 実行処理のコードブロック)のオプションで,さまざまなオプションを指定することで表示などの制御が行える.
パッケージオプションは,knitr 自体の制御をするためのオプションである.

今回の記事では,チャンクオプションのみ解説をする.

チャンクオプション

チャンクには,knitr を制御するためのさまざまなオプションがあります.
今回の記事はあくまでも基礎編という立て付けなので,必要最低限必要になりそうなチャンクのオプションを紹介します.

オプション デフォルト値 説明
fig.width numeric 7 画像の幅をインチで指定
fig.height numeric 7 画像の高さをインチで指定
fig.align character 'default' 画像の位置を指定 (left, right and center)
echo logical or numeric TRUE R のコードを表示するかどうか
results character "markdown" "asis", "hold", "hide"
warning logical TRUE 警告メッセージを表示するかどうか
error logical TRUE エラーメッセージを表示するかどうか
cache logical FALSE R の実行結果をキャッシュとするかどうか
dev character HTML/Markdown => 'png' プロット図のフィアル形式(bmp, postscript, pdf, png, svg, jpeg, pictex, tiff, win.metafile など)
engine character R チャンクの中で実行する言語を指定(python, awk, ruby, bash, haskel, perl, etc)

results オプション

resluts オプションの各設定値について説明します.

  • "markdown": マークダウンとして出力
  • "asis": マークダウンに変換するなどせず,そのまま出力
  • "hold": 都度 R のコマンドと結果を出力するのではなく,チャンクの R コード全部を一塊で出力
  • "hide": 標準出力は表示しない

Appendix A:knitr で HTML に変換するコマンド

RStudio では R markdown を HTML に変換するのには,1クリックですんでしまいます.
(自分のように)GUI よりも CUI の方が生産性が高いという方もいるかと思います.

R の関数として,R markdown から HTML を生成する方法の説明をします.
この場合,R markdown ファイルが /path/to/hoge.Rmd として保存されているとします.

knit2html 関数の options オプションに与えると便利な

RStudio の場合

RStudio の場合は,setwd 関数で作業ディレクトリを /path/to に変更します.

setwd("/path/to")  # /path/to に working directory を設定
require(knitr)  # knitr を読み込む
knit2html("hoge.Rmd")  # HTML を生成

Unix/Linux の場合

CUI 環境で作業しているときは,setwd を利用するよりもそもそもの R の起動場所を R markdown と同じディレクトリにしてしまう方が個人的には好きです.
その理由は,プロット図やキャッシュの作成場所を R markdown ファイルと同じにしたいためです.

shell > cd/path/to
shell > R

R > require(knitr)
R > knit2html("hoge.Rmd")

options オプションの例

knit2html 関数の options オプションには,配列で値を指定します.
この配列に与えるオプションで,簡単で便利なものを紹介します.

knit2html("hoge.Rmd", options = c("toc", "mathjax"))
オプション値 説明
"toc" 生成する HTML に h1, h2 などのヘッダ要素にしたがって目次を先頭に追加
"mathjax" R markdown で記述した数式を表示できるようにする

練習問題集

練習問題:h1, h2, h3 要素を markdown で書いてみよう

正解例

# タイトル
## 部
### 章

練習問題:R markdown 中で R の処理を書いて実行してみよう

正解例

` ``{r}
1 + 1
` ``

練習問題:R markdown 中の文章中インラインで R を実行してみよう

` ``{r}
tmp <- 10 ** 3
` ``

tmp の結果は `\r tmp` です.

練習問題:プロット図の幅と高さを変えてみよう

正解例

` ``{r fig.width=4, fig.height=4}
plot(1:10)
` ``
plot(1:10)

plot of chunk fig-width-height

練習問題:プロット図の位置を真ん中に変えてみよう

正解例

` ``{r fig.width=4, fig.height=4, fig.align='center'}
plot(1:10)
` ``

練習問題:プロット図を JPEG に変更しよう

正解例

` ``{r dev-option, fig.width=4, fig.height=4, dev='jpeg'}
plot(1:10)
` ``

plot of chunk unnamed-chunk-5

練習問題:行列やデータフレームを kable 関数で整形された状態で出力しよう

正解例

` ``{r results='asis'}
kable(head(iris, 5))
` ``
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
5.1 3.5 1.4 0.2 setosa
4.9 3.0 1.4 0.2 setosa
4.7 3.2 1.3 0.2 setosa
4.6 3.1 1.5 0.2 setosa
5.0 3.6 1.4 0.2 setosa

練習問題:チャンク内の R のコードを表示しないように指定しよう

正解例

` ``{r echo=FALSE}
1+1
` ``
## [1] 2

練習問題:for 文を使って大量にプロット図を 20 枚生成してみよう

正解例

` ``{r fig.width=3, fig.height=3, echo=FALSE}
for (i in 1:20) {
  df <- data.frame(x = runif(100), y = runif(100))
  plot(df, main=i)
}
` ``

![plot of chunk fig-generated-by-for-statement](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAANgAAADYCAYAAACJIC3tAAAEJGlDQ1BJQ0MgUHJvZmlsZQAAOBGFVd9v21QUPolvUqQWPyBYR4eKxa9VU1u5GxqtxgZJk6XtShal6dgqJOQ6N4mpGwfb6baqT3uBNwb8AUDZAw9IPCENBmJ72fbAtElThyqqSUh76MQPISbtBVXhu3ZiJ1PEXPX6yznfOec7517bRD1fabWaGVWIlquunc8klZOnFpSeTYrSs9RLA9Sr6U4tkcvNEi7BFffO6+EdigjL7ZHu/k72I796i9zRiSJPwG4VHX0Z+AxRzNRrtksUvwf7+Gm3BtzzHPDTNgQCqwKXfZwSeNHHJz1OIT8JjtAq6xWtCLwGPLzYZi+3YV8DGMiT4VVuG7oiZpGzrZJhcs/hL49xtzH/Dy6bdf