統計Rとmarkdownの組合せ

T. Yoshiizumi

2017/03/04


<目 次>


1. 統計ソフトRとmarkdown

 markdownは、文書記述ルールの一種です(MarkUpより簡単に記述可能)。

 markdown文書の中に統計解析ソフトRのコードや出力結果を埋め込んで、
統計分析のレポートを手早く作ろうという発想があります。

 それを実現するためのRのライブラリが knitr とか rmarkdown です。

 test.rmd のような拡張子 ‘.rmd’ のファイルを作っておいて、
それをRで処理することにより html や pdf のファイルを生成します。


(1) rmdファイルを処理するためのRプログラム

 前提として、関連のRプログラムに簡単に触れておきます。

 test.rmd を処理するためのRプログラム(program.r)は下のとおり。

-------- program.r ここから
library(rmarkdown)
library(knitr)
render("test.rmd")
-------- program.r ここまで

 上を実行すると、test.html が作成されます。

 この実行のためには、rmarkdown, knitr を予め パッケージとしてインストールしておく必要があります。

 また、Rとは別のソフトウェア pandoc もインストール済みでなければなりません。

    

 Rプログラムを実行するコマンドラインの一例は次のとおり。

R CMD BATCH --no-save -q program.r log.txt  [enter]

 処理プロセスが log.txt に記録されます。

 エラーが発生したとき、この log.txt をみればエラー内容がわかります。

目次に戻る


(2) Inlineコードの組み込み

 以下では、rmdファイルの簡単なテスト例を示します。

まずは、文章の途中にRの出力を埋め込む例(inline)です。

  1.  1から10までを合計すると 55 となる。
  2.  当文書の作成日時: 2017/03/04 16:57:29

 上の2行を出力するためのrmdファイルの原稿は下のとおり。

---- rmdファイルの一部ここから
1から10までを合計すると `r sum(1:10)` となる。
当文書の作成日時: `r format(Sys.time(), '%Y/%m/%d %H:%M:%S')`
---- rmdファイルの一部ここまで

 「`r ……`」というのが記述パターンです。

 半角のアクサングラーブ記号の後に半角アルファベットのrを書き、
アクサングラーブで閉じます。

目次に戻る


(3) Blockコードの組み込み

次に、Rプログラムの出力をブロックとして組み込む例を示します。

つまり、文章の途中に組み込むのでなく、独立した行にします。

100人分の「身長」を乱数発生させて、
その要約(summary)を掲げます。

1height <- rnorm(n=100, mean=162.0, sd=8.0)
2summary(height)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   142.0   155.7   160.2   161.7   167.2   180.5

 上の結果を出力するためのrmdファイルの原稿は下のとおり。

---- rmdファイルの一部ここから
```{r echo=TRUE}
height <- rnorm(n=100, mean=162.0, sd=8.0)
summary(height)
```
---- rmdファイルの一部ここまで

 ブロックは、「```{r ……}」から始まり、「```」で終わります。

 半角のアクサングラーブ記号を三つ書きます。

    

 次に、度数分布表示すると次のとおり。

区分 人数
140〜145 1
145〜150 6
150〜155 14
155〜160 29
160〜165 19
165〜170 12
170〜175 9
175〜180 8
180〜185 2

(別途掲載のヒストグラムも参照)

身長のヒストグラム

    

 「身長」のデータが正規分布に即しているかどうかをチェックするため
shapiro.test を行った結果は下のとおり。

1s <- shapiro.test(height)
2print(s)
## 
## 	Shapiro-Wilk normality test
## 
## data:  height
## W = 0.97549, p-value = 0.0589

上記の p.value の値から「正規性 Yes」と判断されます。

    

[補足] 正規分布について

 正規分布の場合、平均値をμ、標準偏差をσとしたとき、 次のことが想定されます。

 今回の「身長」の不偏標準偏差は 8.6399201 です。

平均値:

不偏標準偏差:

目次に戻る


2. RscriptによるRプログラムの実行

 Rプログラムを記述した program.r を用意しなくても、 次のコマンドラインで test.rmd から test.html を生成できます。

rscript -e library('knitr') -e rmarkdown::render('test.rmd')  [enter]

 この場合、処理プロセスはコンソール画面に出力されます。

    

 rscript は引数を受け取って処理することができます。

 なので、下記のような program01.r があると、下のコマンドラインで、 複数のrmdファイルを次々とhtmlに変換していくことができます。

rscript --vanilla program01.r test01.rmd test02.rmd …… [enter]

 --vanilla は必須ではありませんが、暗黙の作業用ファイルの処理などを 極力 抑制したいときに指定します。

 program01.r は下のとおり。

-------- program01.r ここから
library(rmarkdown)
library(knitr)
arg <- commandArgs(TRUE)
if (length(arg) == 0)
    stop("引数がありません!")
for (infile in arg) {
    if (!file.exists(infile)) {
        warning(sprintf("'%s' がみつかりません.", infile))
        next
    }
    infile <- basename(infile)
    render(infile)
}
-------- program01.r ここまで

    

 test.rmd を html ではなく、 test.md(markdownファイル)に変換するだけなら 下の記述で行えます。その場合、pandocは必要ありません。

knit(input="test.rmd", output="test.md")

 前述の program01.r を変更して、 mdファイルを出力するようにしたのが次のプログラムです。

-------- program02.r ここから
library(knitr)
arg <- commandArgs(TRUE)
if (length(arg) == 0)
    stop("引数がありません!")
for (infile in arg) {
    if (!file.exists(infile)) {
        warning(sprintf("'%s' がみつかりません.", infile))
        next
    }
    infile <- basename(infile)
    outfile <- paste0(sub("\\.[^.]*$", "", infile), ".md")
    knit(input=infile, output=outfile)
}
-------- program02.r ここまで

 markdownファイルをhtmlに変換するのに、knitr や pandoc でなく、 好みのパーサで処理したいときに上記が利用できます。

目次に戻る


3. rmarkdownに関する参考サイト

筆者には次のサイトが参考になりました。

なお、rmarkdownではpandocというコマンドが重要な役割を担います。

その意味で下のサイトは外せません。

Pandoc ユーザーズガイド 日本語版 - Japanese Pandoc User’s Association

〜 以上 〜