markdownは、文書記述ルールの一種です(MarkUpより簡単に記述可能)。
markdown文書の中に統計解析ソフトRのコードや出力結果を埋め込んで、
統計分析のレポートを手早く作ろうという発想があります。
それを実現するためのRのライブラリが knitr とか rmarkdown です。
test.rmd のような拡張子 ‘.rmd’ のファイルを作っておいて、
それをRで処理することにより html や pdf のファイルを生成します。
前提として、関連の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 をみればエラー内容がわかります。
以下では、rmdファイルの簡単なテスト例を示します。
まずは、文章の途中にRの出力を埋め込む例(inline)です。
上の2行を出力するためのrmdファイルの原稿は下のとおり。
---- rmdファイルの一部ここから
1から10までを合計すると `r sum(1:10)` となる。
当文書の作成日時: `r format(Sys.time(), '%Y/%m/%d %H:%M:%S')`
---- rmdファイルの一部ここまで
「`r ……`」というのが記述パターンです。
半角のアクサングラーブ記号の後に半角アルファベットのrを書き、
アクサングラーブで閉じます。
次に、Rプログラムの出力をブロックとして組み込む例を示します。
つまり、文章の途中に組み込むのでなく、独立した行にします。
100人分の「身長」を乱数発生させて、
その要約(summary)を掲げます。
## 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 を行った結果は下のとおり。
##
## Shapiro-Wilk normality test
##
## data: height
## W = 0.97549, p-value = 0.0589
上記の p.value の値から「正規性 Yes」と判断されます。
正規分布の場合、平均値をμ、標準偏差をσとしたとき、 次のことが想定されます。
今回の「身長」の不偏標準偏差は 8.6399201 です。
平均値:
不偏標準偏差:
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 でなく、 好みのパーサで処理したいときに上記が利用できます。
筆者には次のサイトが参考になりました。
なお、rmarkdownではpandocというコマンドが重要な役割を担います。
その意味で下のサイトは外せません。
Pandoc ユーザーズガイド 日本語版 - Japanese Pandoc User’s Association
〜 以上 〜