第36回

勉強会@東京(#TokyoR)

~knitr+pandocではじめる~
『R MarkdownでReproducible Research』

@teramonagi
もくじ
• 自己紹介&モチベーション
• 準備
• R MarkdownでReproducible Research
–基礎編
–応用編
• まとめ
• 参考(書籍|スライド|サイト)
2
自己紹介
• ID:@teramonagi
• 興味:/R/C++/F#/
微分幾何/モンテ
カルロ法/物理学
/金YOU/

• 直近:ドキュメン
テーション辛い
3
このお話のモチベーション
• 計算/分析結果をまとめたWord/TeX
を書くのがめんどい
–TeXのタグがしんどい。Wordの“見
出し”が俺の言うこと聞かない…
• そもそも結果に再現性がない
–あのcsvとあのDBのデータを持っ
て来て云々…あれ?結果が違う?
4
これから1,000枚の図
を手で報告書に貼りつ
けなきゃならんぜ!!!
終電コース!!!

5
そういうの、もうしんどい

この状況、
どうにかなら
ないの?
6
でも、大丈夫

そう、

Markdownならね

7
Markdownを使えば…
• Rのコードと、資料本文を管理・作成
(文芸的プログラミングの実践)
• コードと本文から成るドキュメントを
再実行(コンパイル)すれば結果の
再現性が担保される
(Reproducible Research)
※“文芸的プログラミング”と“Reproducible Research”の正確な定義がよくわからん…

8
準備
9
本スライドの話に必要な道具
• Rstudio(knitrパッケージ)
• pandoc
• TeX環境一式
• (Windows)
• (Microsoft Office環境)
10
RStudio
• Rの統合開発環境(IDE)

http://www.rstudio.com/ide/download/desktop

11
knitrパッケージ
• Rのコンソールで、以下のコマンドを
実行

> install.packages("knitr")

12
Pandoc
• ドキュメント・コンバータ

http://johnmacfarlane.net/pandoc/

13

※PDF/MS Wordを作るのに使用。LINK先にあるDLページからmsiファイルでインストール
TeX
• TeXインストーラ(PDF作成用)

http://www.math.sci.hokudai.ac.jp/~abenori/soft/abtexinst.html
※TeXをPDFにする際に使用。LINK下部の【ダウンロード】から最新版をインストール

14
R MarkdownでReproducible Research

基礎編
15
R Markdownを書くために
• Rstudio上でknitrパッケージを使用
• knitr≒文芸的プログラミングエンジン
• R(コード)と「LaTeX, HTML, Markdown,
reStructuredText」等の本文を組み合
わせ、動的にレポートを生成可能
• ”チャンク(chunk)”というコード(塊?片?)
とレポート”本文”をあわせて書く
※実はR以外にもC++・python・awkなんかもいける

16
大まかな流れ
(
.html
何
.Rmd
ら
(R Markdown)
.docx
か
の
処
knitr
.pdf
.Rhtml
理
(R HTML)
パッケージ
挟
.md
む
.Rnw
こ
.tex
(TeX+R)
と
屡
等
※reStructuredTextなんかもイケる
※正確に言うと、knitrパッケージは【R Markdown(.Rmd)】→【Markdown(.md)】を担当
17
)

R+本文(HTML, MarkDown等)
.Rnwファイルの処理法

2つの処理法
がある

※Rstudioの設定画面(【Tools】→【Options】)

18
knitr/Sweaveの違い

Rのパッケージ
knitr
Sweave
処理対象
.Rhtml

.Rmd

.Rnw

※knitrとSweaveでは.Rnwを処理する際に使えるchunkのオプションがちょいと違う

19
.Rnw/.Rmdの違い
• TeXベース(.Rnw)かMarkdownベー
ス(.Rmd)かが違う
• できる事は.Rnwの方が多い(はず)

.Rnw
.Rmd
※.RnwのnwはNowebの意味でそういうLiterate Programmingツールに由来するらしい

20
本題へ
21
まずは新規ファイルの作成

クリック

※Rstudioを立ち上げて【File】

22
デフォルトでなんか入ってる
1:ファイルを保存(UTF-8推奨)

2:を押す
※ファイルに変更がないと保存できないかも

23
結果(HTML)がプレビューされる

24
以下、こ
の.Rmdファ
イルに、コー
ドと文章を書
いきます
25
この後(少なくとも俺は)こうしてる
• 基本的に
1. (適当に)文章書いて
2. 間にRのコードを挟む
な感じで書いていく
• 時々、[Knit HTML]押してチェック
←行ったり来たり→

.Rmd
(R Markdown)

knitr

※もっといいやり方あったら教えてください

.html
26
まずは基本的な書き方
• 本文の間にチャンクと呼ばれる
```{r label, option1, …., optionN}
----ここにRのコード----```
を書き、Rのコードを埋め込んでいく
(label・optionはIDと処理のオプション)
• .Rhtmlでも.Rnwでも基本こんな感じ
(Chunkの開始・終了タグがちょいと違うだけ)
27
まずは基本的な書き方
• 以下の内容を.Rmdファイルに追記
やぁ、みんなこんにちは!
ぼくのRのversionは
```{r my_r_version, warning=TRUE}
R.version.string
```
Rのコード
ダヨ!!!

Chunk

Chunkのlabel. ID的なもん

Chunkのオプション的なもん

28
まずは基本的な書き方
• [Knit HTML]ボタン押すと以下のよう
な、出力が得られる

※宗教上の理由で古いRを使っております

29
アドバイス
• Chunkのlabelは同/別のファイルか
ら参照する際に使用されるんで、な
くてもOKだが、必要ならちゃんとつ
けとけ。chunkの共有・参照に便利
• Chunkのオプションはたくさんあるか
ら、使いそうなもんだけ覚えておけ
(後述)
30
インラインChunk
• 以下の内容を.Rmdファイルに追記
`r XXX`でインライン展
開されるchunkになる

carsデータに関する回帰分析だーっ!
```{r lm_result}
x <- lm(dist~speed, data=cars)
```
この結果、回帰係数の切片は
`r coef(x)["speed"]`となった。
31
インラインChunk
• 文章中に結果が埋め込まれる
• 結果を適当な変数に入れておけば、
文章だけ先に用意することも可能

32
数式の追加
• 以下の内容を.Rmdファイルに追記
数式も表示できるヨ!!
$でインラインな数式
$f(x) = ax^2 + bx + c$、
$$で1行まるごと数式
$$f(x) = ax^2 + bx + c$$

TeX記法
を用いる

33
数式の追加
• 実行結果(HTML)
• mathjaxを用いて描画されている

34
表の追加
• resultsオプションに、”そのまま出力”を
意味する’asis’を指定
• knitr内のkable関数を使用(xtableも可)
• format=“markdown”でpandoc用
markdownテーブルへ出力可
```{r table1, results='asis'}
x <- lm(dist ~ speed, data=cars)
kable(summary(x)$coef, format="html",digits=2)
```
※その他、panderパッケージなるものを使う手もある

35
表の追加
• 表の”見てくれ”を変えたい場合は、
HTML表示の際に使われるcssファイ
ルを変える必要あり(※)

※参照:http://www.slideshare.net/wdkz/rstudio-13866958

36
図の追加
• 単純にPLOT関数を書けばOK
• fig.(width|height)には出力(Not 張付)
画像サイズをインチ単位で指定
• fig.capオプションに文字列を指定する
と図のキャプションも入る(Word等時)
```{r plot_cars, fig.width=5, fig.height=4}
plot(cars)
```
37
図の追加

38
図の追加
• ggplot2なんかもOK
```{r plot_iris, fig.width=5, fig.height=4}
library(ggplot2)
qplot(Sepal.Length, Sepal.Width, data
=iris, colour=Species)
```
39
図の追加

40
グローバルにオプション指定
• 毎回chunkにオプション書くのめんどい
• opts_chunkで全体に対して一括でオプ
ションを指定できる
```{r global_option, eval=FALSE}
#opts_chunk$setで指定したものは、
#全体に設定されるので以降指定しなくてOK
opts_chunk$set(fig.width=6, fig.height=6)
```
41
その他のオプションについて

R markdown(knitr)パッケージのchunk optionまとめ
http://d.hatena.ne.jp/teramonagi/20130615/1371303616

42
基礎編のまとめ
• とりあえずHTMLで
–Rの基本的な実行結果
–図・表・数式
が出力できるようになった!
• レポートをHTMLで作成していいなら
これで大体OK
• オプションは必要に応じてググれ
43
本文を書く際に使える

Markdownのクイックリファレンス
Markdownの
クイックリファレン
スが開くクリック

※見出し、フォント等の設定法が書いてある。最新版のRStudioだとちょい見てくれ違う

44
R MarkdownでReproducible Research

応用編
45
応用編

• もうちょっと”凝った”ものを作
るためのテクニック的なもの
• 俺が悩んで酷い目にあったも
のへの対処法
…を紹介
46
Chunkオプションの条件化
• ChunkオプションにはRの変数や関
数の結果を代入することが可能
• 例:xが3より大きい場合のみchunk
を評価
```{r conditionalchunk_eval, eval=(x>3)}
print("x は3より大きい")
```
※ 図の番号をつけるのとかにも使える
※参照:https://github.com/yihui/knitr-examples/blob/master/070-caption-num.Rmd

47
スクリプトの共有
• read_chunk関数により、Rで書いた他の
ファイルを取りこむことが可能
• 以下の内容のファイルが”share/shared.R”
として保存してあると仮定
## @knitr plus10r

plus10 <- function(x){
x+10
}
plus10(3)

## @knitr subset_iris

subset(iris, Sepal.Length>7.6)

48
スクリプトの共有
.Rmdの例

その出力結果

```{r read_shared_r}
read_chunk("share/shared_r.R")
```
```{r plus10r}
```

shared_r.R内の関数が
## @knitr plus10r
という書式で指定されたラベルで実行できる!
49
.Rmdファイルの分割
• 以下のような内容の.Rmdを作成
(share/shared_rmd.Rmdとした)
```{r child_rmd}
print("これは別ファイルに記述されたR Markdownです")
```

• 別の.Rmdでchildオプションで指定
```{r child1, child="share/shared_rmd.Rmd"}
```

50
.Rmdファイルの分割
• .Rmdが展開(本文)され、chunkも実
行される
• 複数人で書く、あるいは章ごとに分
けるなどの際に便利

51
他の言語、突っ込む
• engineオプションを指定することで、
他の言語(python, ruby, sed, awk,
haskell, SAS, perl)をchunkとして突っ
込める
• 更に、Rcppを指定するとRcppのコー
ドを書く事も可能
52
他の言語、突っ込む(Rcpp)
• フィボナッチ数列計算関数作成
```{r engine_rcpp, engine='Rcpp'}

#include<Rcpp.h>

// [[Rcpp::export]]
int fibCpp(const int x){
if(x==0 || x==1){return(x);}
return(fibCpp(x-1) + fibCpp(x-2));
}
```
53
他の言語、突っ込む(Rcpp)
• 作成した関数を.Rmd内部で使用
```{r r use_rcpp}
#Rcppで作成した関数を使用
fibCpp(10)
```

54
他の言語、突っ込む(python)
• フィボナッチ数列計算関数作成&実行
```{r engine='python'}
def fibPy(n):
if n == 0 or n == 1 :
return n
else:
return fibPy(n-1) + fibPy(n-2)
print fibPy(10)
```
55
他の言語、突っ込む(python)
• HTMLとして出力すると、ちゃんとソー
ス+実行された結果が返ってくる

56
Chunkのエイリアス
• Chunkオプションには、略記のため
の”別名”を付けることも可能
```{r}
set_alias(w = "fig.width", h = "fig.height")
```
```{r w=7, h=6}
plot(cars)
```
※正確にはchunkオプション以外にPackageオプションがあり、aliasはその1つ

57
コードをAppendixに載せる
Aという手法を用いると、以下のような結果が算出される。
```{r AppA, echo=FALSE}
1+1
```
一方、手法Bを用いると、以下のような結果となった。
```{r AppB, echo=FALSE}
2+3
```
~Appendix~
手法Aのコード
```{r AppA, eval=FALSE}
```
手法Bのコード
```{r ref.label=c('AppB'), eval=FALSE}
```
※ちなみにall_labels関数を用いると全chunkのlabelが引ける

58
コードをAppendixに載せる

59
テンプレートからの作成
• Rのソースコードを雛型として、一気に
定型レポート作成する関数もあり
–spin: .R ---> .md
–stitch: .R ---> .md/.html/.pdf(*1)
• spinは変換のみ
• stitchは簡単なレポートのテンプレート
まで作ってくれる(*2)
※1: 日本語環境だとpdf生成は、相当頑張って設定しないとキツいとおもう…
※2: デフォルトのテンプレートだとsessioninfo, ファイルの生成時間を自動で付けてくれたり
する。テンプレートは指定可能。

60
テンプレートからの作成
• spin関数、RStudioから即使えます
こいつをポチる

61
テンプレートからの作成
• spin関数による変換結果

62
さて、
63
日本を支える
ビジネスマンの
皆さん
64
鬼門です
65
鬼門
すぐに Word
で報告書を
作成して
66
手で図・表の結果をWord貼り付ける…
枚数によっては

※VBA使ってもしんどい

67
Word/PDFで出力したい
• Pandocを使って、knitrの出力
(Markdown)をWord/PDFへ変換する
方向で
• knitrから直接変換できるものの、日
本語が入ると正直キツい
• これは試行錯誤の末の一案なので、
だれかもっといいやり方あったら教
えて…
68
ドキュメント変換のルート
markdown

.Rmd

基礎編のルート

.md

pandoc

pandoc

knitr

.tex

.html
.docx

TeX
(LuaLaTeX)

.pdf
69
ドキュメント変換に向けて
• HTML以外にするためには、ある程
度knitrが中でどんな動きをしている
のかを知っておくのが得策
• というわけで、[Knit HTML]ボタンを
押した場合の挙動をちょいと紹介

70
[Knit HTML]ポチった時の動作
.Rmd
(R Markdown)

knit関数
(knitrパッケージ)

.md
(Markdown)

markdownToHTML関数
(markwodnパッケージ)

.html
(HTML)
※実際はRstudio内部にあるMarkdownからHTMLにする内部関数が使われてるらしい

71
[Knit HTML]ポチった時の動作
• 模倣するには、以下のように書く
library(knitr)
library(markdown)
output <- knit(“TokyoR36_Basic.rmd”,encoding=“UTF-8”)
#「invalid multibyte string at」
#というエラーが出るので解消するためにロケール変えてる。
#Windows 7だけかも?
#ロケール変えなくていいなら
#knitr::knit2html関数もほぼ同じ挙動
Sys.setlocale(locale=“C”)
markdownToHTML(output, output=“ TokyoR36_Basic.html")

72
ドキュメント変換の指針
• なんで、knit関数を使って、
Markdown(.md)を作成した後、これ
をmarkdownパッケージ経由でHTML
にはせずに、Word/PDFに“変換”す
る方法を取る
• その”変換”にはpandocを使用
73
ドキュメント変換の際の注意
• HTMLでチェックしつつ、Markdownに
持って行こうと思う場合、表の形式を
HTML⇔Markdownで切り替える必要
がある
• とりあえず、以下のようなコード
を、.Rmdの頭に書くようにしておいた
```{r table_format}

table.format <- ifelse(exists(“table.format”), table.format, “html”)
```
※参考程度に後述するhookってのを使うのもあり

74
Wordへの変換
• こんな感じでいけます
• pandocはRのpandoc関数で召喚
• tableがmarkdownになるように設定
```{r convert_to_docx, eval=FALSE}
library(knitr)
env <- new.env()
assign(“table.format”, “markdown”, env)
output <- knit(“TokyoR36_Basic.Rmd”, envir=env, encoding=“UTF-8”)
pandoc(output, format=‘docx’)
```
※pandocのオプションとして--reference-docxをつけると.docxの書式等を指定したテンプレートが使える
※ @sky_y氏作の日本語訳有!多謝!(http://sky-y.github.io/site-pandoc-jp/users-guide/)

75
Wordへの変換結果

76
からの、

罠

• 僕のWord数式が文字化ける

※Word 2007だけかも?手元に環境がないのでよくわからない

77
数式の文字化け修正
• Wordファイルの拡張子を.docx→zip
へと変更
• zipを解凍し、word/document.xmlを
適当なテキストエディタで開く

78
数式の文字化け修正
ファイル内の

<m:t>
を

<w:rFonts w:hAnsi="Cambria Math"
w:ascii="Cambria Math"/><m:t>
に置換&保存する
79
数式の文字化け修正
• 解凍したファイル4つを選択し、また再圧縮
• 拡張子を.docxに戻す

80
数式の文字化け修正
• 拡張子をdocxに戻すとちゃんと数式
が表示される!!!
• オイラやったよ!!!

81
やったね!

図・表の1,000枚程度、

ドンと来い
82
PDFで出力したい
• [.md]→[.tex]→[.pdf]とTeX経由でPDFへ
• 以下のような”おまじない”でPDFになります
• コマンドプロンプトで「pandoc –D latex」と
打って出る結果が、デフォルトのTeXのテン
プレートになるので、スタイル変更したい場
合は、適当に改変する必要有(*)
library(knitr)
env <- new.env()
assign(“table.format”, “markdown”, env)
output <- knit(“TokyoR36_Basic.Rmd”, envir=env, encoding=“UTF-8”)
system(sprintf(“pandoc -s %s -V documentclass=ltjltxdoc -o hoge.tex”, output))
system(“lualatex -interaction=nonstopmode hoge.tex”)
※おとなしくユーザガイド見るのが一番いい(http://johnmacfarlane.net/pandoc/README.html
※ @sky_y氏作の日本語訳有!多謝!(http://sky-y.github.io/site-pandoc-jp/users-guide/)

83
PDFで出力したい

ごちゃごちゃ面
倒だし、Wordを
PDFで名前付け
て保存でいいや
※あくまで私見です

84
この資料で全く解説してない内容
• hookというknitr内で行われるR
Markdown処理の拡張方法がある
–chunkオプションを拡張する事がで
きる
–Chunkの処理(前後)に好きな処理
を挟むことが出来る
• “knit_hooks”で調べると良い
※正確にはchunk hooksとoutput hooksがある
※render_XXX(関数を調べるとよい

85
後は頑張って作者のページ嫁

http://yihui.name/knitr/

86
変換周りはPandocのマニュアル嫁

http://johnmacfarlane.net/pandoc/README.html
87
Pandocの日本語ユーザーズマニュアル有

@sky_y氏多謝!!!( http://sky-y.github.io/site-pandoc-jp/users-guide/)

88
Enjoy!!!
89
参考書籍
Dynamic Documents with R and knitr
どちらかとい
うとLaTeXとい
うか.Rnwの話
題が多い

90
参考スライド
そろそろRStudioの話でもしてみようと思う

http://www.slideshare.net/wdkz/rstudio-13866958 91
参考スライド
RStudio事始め

http://www.slideshare.net/TakashiYamane1/rstudio92
参考スライド
RでReproducible Research

http://www.slideshare.net/sfchaos/rreproducible-research-13569000

93
参考サイト

http://kbroman.github.io/knitr_knutshell/

94
参考サイト

https://github.com/yihui/knitr-examples 95
参考サイト

http://d.hatena.ne.jp/a_bicky/20140221/1392941055

96

~knitr+pandocではじめる~『R MarkdownでReproducible Research』