もう一つのデータ処理パッケージ2017版で紹介しているrptパッケージには、multirmd.r というファイルが含まれています。
統計解析ソフトR用の関数群を記述したファイルです。
このMultiRMDは、統計解析ソフトRの rmarkdown をもう少し便利に使いたいとおもって作りました。
Rプログラムの実行結果をみて、それに応じて用いるmarkdownのテンプレートを切り替える、というのが MultiRMD の「やりたかったこと」です。
たとえば、データの分布に正規性が認められるか否かで検定方法を切り替えたり、
有意な相関が認められるかどうかで分析の仕方を替えたりします。
そうしたときに、複数のmarkdownテンプレートを用意しておいて切り替えられればと考えたものです。
MultiRMDについて述べる前に、まずrmarkdownに関する仕様を確認します。
統計解析ソフトRに rmarkdown というパッケージがあります。
markdown形式で書かれた原稿の中に、Rのプログラムコードを埋め込みます。
それを test.rmd というファイルとして保存します。
その test.rmd をRの rmarkdown を活用して処理すると、htmlファイルが作られます。
test.rmd の一例をあげると次のとおり。
---- rmdファイルここから
```{r echo=TRUE}
dice <- as.integer(runif(10, min=1, max=7)) # 1〜6の整数を10個発生
print(dice)
```
---- rmdファイルここまで
上を処理した結果は下のような出力になります。
## [1] 5 3 3 5 2 6 3 1 2 3
Rのプログラムコードの部分を半角アクサングラーブ三個で囲みます。
半角アクサングラーブ三個で囲んだ部分をチャンク(chunk)といいます。
「ひとかたまり」という意味です。
[補足] test.rmdからhtmlを生成するためのRプログラム
次の3行からなるRプログラムを実行すると test.html ができます。
-------- ここから
library(rmarkdown)
library(knitr)
render("test.rmd")
-------- ここまで
Rプログラムの実行方法については、下のサイトに書いたので参考にして下さい。
前述のtest.rmdに出てきた echo=TRUE
は、chunkの扱いを指定するオプションです。
これが TRUE だと、Rの実行結果だけでなく、Rのプログラムコードそのものも出力されます。
FALSE なら、Rの実行結果だけ出力されます。プログラムコードは出力されません。
include=FALSE
を指定すると、Rプログラムが実行はされるものの、実行結果は出力されません。
「そんなオプションが何の役に立つのか」という感じがしますが、
関数を定義するだけのchunkであれば include=FALSE
にするのが無難です。
オプションについては、たとえば次のサイトが参考になります。
R markdown(rmarkdown)パッケージのchunk optionまとめ
chunkの定義を別のファイルに書いて置いて、それを読み込んで利用することができます。
define.r というファイルにchunkの定義が書かれているものとします。
その中で定義されているchunk名は aaa です。
aaa を呼び出すための test.rmd の記述は下のとおり。
-------- ここから
```{r include=FALSE}
read_chunk("define.r")
```
```{r aaa, echo=TRUE}
```
-------- ここまで
read_chunk()
によって define.r を読み込んでいます。
一方、別ファイル define.r の中身は下のとおりです。
-------- ここから
## @knitr aaa
x <- 123
print(x)
-------- ここまで
ここでのキーワードは ## @knitr chunk_name
です。
define.r には複数のchunk定義を書いておくことができます。
## @knitr chunk_name
の記述があれば、そこから別のchunk定義が始まります。
read_chunk()
でchunkの定義を読み込んだからと要って、そのchunkが直ちに実行・処理されるわけではありません。
chunkを実際に動作させるには、chunk名を手がかりにしてそれを呼び出す必要があることに注意して下さい。
rmdファイルにchunkを記述する場合、chunk名を省略することがよくあります。
```{r echo=TRUE}
というのは省略した形です。
省略しないなら ```{r aaa, echo=TRUE}
のようになります。
省略したときは、rmarkdownが自動的にchunk名を割り当てます。
割り当てられているchunk名を確認したい場合は
opts_current$get('label')
を用います。
-------- ここから
```{r echo=FALSE}
opts_current$get('label')
```
-------- ここまで
上が実行・処理されると、
## [1] "unnamed-chunk-1"
といった出力があるはずです。
これが自動で割り当てられたchunk名です。
今度は別のrmdファイルを取り込む例です。
下のような中身の test02.rmd というファイルが既に用意されているとします。
-------- ここから
```{r echo=TRUE}
x <- 456
print(x)
```
-------- ここまで
上を取り込む test.rmd は次のようになります。
-------- ここから
```{r child="test02.rmd"}
```
-------- ここまで
ここでのキーワードは child=……
です。
この場合は read_chunk()
のときと違って、
test02.rmd に書かれていることが直ちに処理されます。
test02.rmdを取り込むもう一つの書き方も掲げておきます。
-------- ここから
```{r echo=FALSE, results='asis', include=TRUE}
cat(knit_child("test02.rmd", quiet=TRUE), sep='')
```
-------- ここまで
先の child=……
に比べると面倒な書き方です。
ただ、場合に応じて取り込むrmdファイルを切り替えることができます。
変数 p.value
の値が0.05未満のときは test02.rmd を取り込み、
0.05以上なら test03.rmd を取り込む、といった使い方です。
chunkのオプション echo=FALSE, results='asis', include=TRUE
は、
変更すると期待した結果が得られません。ご注意ください。
これまでは markdownの原稿の中に Rプログラムコードを埋め込んできました。
しかし、Rプログラムを主役にし、markdownの原稿は、そのじゃまにならないようにコメントとして書きたいということもあるとおもいます。立場の逆転です。
rmarkdownでは、それを簡単に実現できます。
test.r という Rプログラムのファイルを用意します。
プログラムコードは普通に書きます。
markdownの原稿は #'
の2文字から始まるコメントとして書きます。
chunk名や chunkオプションは、#+
の2文字から始まる行に記述します。
たとえば下のような書き方です。
-------- ここから
#' # テスト出力
#+ echo=TRUE
x <- 456
print(x)
#' inline: 1〜10の数を全部足すと
{{sum(1:10)}}
#' となる。
-------- ここまで
上を処理すると下のような表示のhtmlが得られます。
-------- ここから
test.r
User Name
Tue Mar 07 20:48:32 2017
テスト出力
x <- 456
print(x)
## [1] 456
inline: 1〜10の数を全部足すと 55 となる。
-------- ここまで
rmarkdownは、title, author, date を自動的に付加したうえで処理するようです。
User Name
のところには、OSに登録されているユーザー名が入ります。
この test.r を処理するための Rプログラムは、rmdファイルを処理するものと同じです。
次の3行です。
library(rmarkdown)
library(knitr)
render("test.r")
以上が MultiRMD を利用するための予備知識です。
次は、MultiRMDの簡単なサンプル です。