はじめに
早いもので本連載ももう4回目です。マラソンに例えると、
前回はコードチャンクごとの処理を効率化するということで、
インラインコード
前回までに説明するつもりですっかり忘れていたのですが、
テキスト・・・`r Rのコード` テキスト・・・
バッククォートに続けて、r
、
irisの1列目と2列目の相関は`r cor(iris[[1]], iris[[2]])`です。
この部分は、
irisの1列目と2列目の相関は-0.1175698です。
というように出力されます。もちろんコード部分では別の
YAMLフロントマターによるメタ情報の設定
R Markdownの先頭にはYAMLフロントマターと呼ばれるブロックを記述します
基本的な書式は次の通りです。インデントされた行は子要素として処理されますが、
---
title: "R Markdownで楽々レポートづくり<br/>第4回 レポつく自由自在〜R Markdownにまつわるエトセトラ〜"
author: '@kohske'
date: "`r format(Sys.time(), '%Y/%m/%d')`"
output:
html_document:
self_contained: true
toc: true
---
タイトルなどのメタ情報が、title
、author
、date
くらいを指定しておけばよいでしょう。また、date
の例のようにRのコードを記述しておくこともできます。
レポート作成の設定は、output:
の子要素として出力フォーマットを指定し、html_
、pdf_
、word_
、beamer_
、ioslides_
、slidy_
などがあります。指定できるオプションは、library(rmarkdown)
とした後に、?html_
などとしてヘルプファイルを開けば参照できます。
上記の例では、self_
を有効にして、toc
を有効にして目次を追加しています。HTML以外のフォーマットのレポートを作成するコツや、
日本語HTMLレポートでハマる罠として、#
や##
)ascii_
というパースオプションがあり、
output:
html_document:
toc: true
pandoc_args: [
"--from", "markdown+autolink_bare_uris+tex_math_single_backslash-implicit_figures"
]
とします。
パッケージオプションとフック
R Markdownで.Rmdファイルからレポートを作る際、{knitr}
パッケージにより行われています。{knitr}
のパッケージオプションを設定することで、
パッケージオプションの設定方法
パッケージオプションはセットアップチャンクで設定するのが良いでしょう。opts_
という書式で設定します。
```{r setup, include=FALSE}
# セットアップチャンク
library(knitr)
opts_knit$set(progress = FALSE) # 変換処理の際のプログレスバーを非表示に
```
という感じです。
aliases
aliases
オプションを設定すると、
```{r setup, include=FALSE}
# セットアップチャンク
library(knitr)
opts_knit$set(aliases = c(h="fig.height", w="fig.width"))
```
テキスト・・・
```{r iris-plot, h=12, w=12}
plot(iris)
```
とすれば、iris-plot
チャンクではfig.
と指定されたことになります。地味機能ですが、
チャンクオプションの評価とeval.after
実はRコードチャンクでは、eval.
で指定されたチャンクオプションは、
意味がよくわからないと思いますので、
```{r setup, include=FALSE}
# セットアップチャンク
library(knitr)
opts_knit$set(eval.after = c("fig.cap"))
```
テキスト・・・
```{r cor-plot, fig.cap = paste0('図1: R = ', corr)}
x = rnorm(100)
y = rnorm(100)
corr = cor(x, y)
plot(x, y)
```
このようにすることで、corr
が計算されて、fig.
に反映されます。 サンプル出力はこちらです。
global.par
によるグラフィックスパラメータのグローバル化
解析処理のレポートには大量のグラフが含まれていることも多いでしょう。Rではマージンや背景色といったグラフのパラメータはpar()
関数で設定します。R Markdownの場合、par()
による設定を記述する必要があり、global.
をTRUE
とすることで、
```{r setup, include=FALSE}
# セットアップチャンク
library(knitr)
opts_knit$set(global.par = TRUE)
```
```{r}
par(bg = "pink")
plot(1:10)
```
```{r}
# 上のチャンクのpar()の設定が再利用される
plot(10:1)
```
これで、
フック
R Markdown{knitr}
パッケージ)
ここでは、
```{r setup, include=FALSE}
# セットアップチャンク
library(knitr)
prow = function(before, options, envir) {
if (!before) {
paste0(c("<p>コードは", length(options$code), "行です</p>"))
}
}
knit_hooks$set(prow = prow)
```
```{r, prow=TRUE, echo=FALSE}
# ?histでのヒストグラム作成例
r <- hist(sqrt(islands), breaks = c(4*0:5, 10*3:5, 70, 100, 140),
col = "blue1")
text(r$mids, r$density, r$counts, adj = c(.5, -.5), col = "blue3")
sapply(r[2:3], sum)
sum(r$density * diff(r$breaks)) # == 1
lines(r, lty = 3, border = "purple") # -> lines.histogram(*)
```
サンプル出力はこちらです。
まずセットアップチャンクで、prow
を定義し、knit_
でフック名prow
としてフックに登録しています。次に、prow=TRUE
として、prow
フックを使うことを指示します。そうすると、prow
が呼び出されます。フック関数ではoptions
引数を使ってチャンクの情報にアクセスすることができます。
この連載ではフックについての解説はいわゆるbeyond scopeですのでこれ以上の説明はやめておきますが、
なお、
キャッシュにまつわるエトセトラ
前回の記事で紹介したように、cache=TRUE
を指定したコードチャンクでは、
通常はこれで充分ですが、
キャッシュのリフレッシュ
最も確実に全てのコードを再評価する方法は、cache.
で指定できます。R Markdownではデフォルトは.Rmdファイル名_cache
となっています。このディレクトリを削除すればキャッシュされたものがなくなってしまうので、
cache.extra
の利用
チャンクオプションが変更された場合もキャッシュは無効化されます。この仕組みを利用して、cache.
を一括指定することで、cache.
にRのバージョン文字列を指定しておけば、
```{r setup, include=FALSE}
# セットアップチャンク
library(knitr)
opts_chunk$set(cache.extra = R.version.string)
```
Rのバージョン文字列の代わりに、Sys.
)tools::md5sum('foo.
)
入力ファイルへの依存
大きなファイルの処理はコストがかかるので、cache.
を変更することも可能ですが、
このような場合、
```{r cache=TRUE, cache.e = tools::md5sum("foo.csv")}
# foo.csvに依存する処理
# x = read.csv("foo.csv")
# ...
```
これで、foo.
のmd5sumハッシュ値に変更があった時
チャンクの依存関係
コードチャンクAで作成したオブジェクトをコードチャンクBで使って処理する場合、dependson
に依存するチャンクのチャンクラベルc1
)c1
チャンクに変更があった時にc2
チャンクも再評価されます。
```{r c1, cache=TRUE}
a = 1
print(a)
```
```{r c2, cache=TRUE, dependson = "c1"}
# c1に変更があればこのチャンクも評価される
b = a + 2
print(b)
```
また、autodep
をTRUE
にすると、dependson
で明示するのが良いでしょう。
まとめ
今回の内容はやや高度だったかもしれません。このエトセトラを身に付ければR Markdown名人と言っても過言ではありません。きっと同僚から
また、
突然ですが、
今回紹介したレポートづくりのエトセトラを活用して仕事をさっさと終わらせて、
次回は
レポートといえば主役はグラフや表です。次回はR Markdownでグラフや表を効果的に扱う方法を紹介します。