~knitr+pandocではじめる~ 『R MarkdownでReproducible Research』
第36回 勉強会@東京(#TokyoR)
@teramonagi
もくじ
• 自己紹介&モチベーション
• 準備
• R MarkdownでReproducible Research
–基礎編
–応用編
• まとめ
• 参考(書籍|スライド|サイト) 2
自己紹介
• ID:@teramonagi
•興味:/R/C++/F#/微分幾何/モンテカルロ法/物理学/金YOU/
•直近:ドキュメンテーション辛い
3
このお話のモチベーション
•計算/分析結果をまとめたWord/TeXを書くのがめんどい
–TeXのタグがしんどい。Wordの“見出し”が俺の言うこと聞かない…
•そもそも結果に再現性がない
–あのcsvとあのDBのデータを持って来て云々…あれ?結果が違う?
4
5
これから1,000枚の図
を手で報告書に貼りつけなきゃならんぜ!!! 終電コース!!!
そういうの、もうしんどい
6
この状況、
どうにかならないの?
でも、大丈夫
そう、 Markdownならね
7
Markdownを使えば…
• Rのコードと、資料本文を管理・作成
(文芸的プログラミングの実践)
• コードと本文から成るドキュメントを再実行(コンパイル)すれば結果の再現性が担保される
(Reproducible Research)
8 ※“文芸的プログラミング”と“Reproducible Research”の正確な定義がよくわからん…
準備
9
本スライドの話に必要な道具
• Rstudio(knitrパッケージ)
• pandoc
• TeX環境一式
• (Windows)
• (Microsoft Office環境)
10
RStudio
• Rの統合開発環境(IDE)
11 http://www.rstudio.com/ide/download/desktop
knitrパッケージ
• Rのコンソールで、以下のコマンドを実行
12
> install.packages("knitr")
Pandoc
• ドキュメント・コンバータ
13 http://johnmacfarlane.net/pandoc/
※PDF/MS Wordを作るのに使用。LINK先にあるDLページからmsiファイルでインストール
TeX
• TeXインストーラ(PDF作成用)
14 http://www.math.sci.hokudai.ac.jp/~abenori/soft/abtexinst.html
※TeXをPDFにする際に使用。LINK下部の【ダウンロード】から最新版をインストール
R MarkdownでReproducible Research
基礎編
15
R Markdownを書くために • Rstudio上でknitrパッケージを使用
• knitr≒文芸的プログラミングエンジン
• R(コード)と「LaTeX, HTML, Markdown, reStructuredText」等の本文を組み合わせ、動的にレポートを生成可能
• ”チャンク(chunk)”というコード(塊?片?)とレポート”本文”をあわせて書く
16 ※実はR以外にもC++・python・awkなんかもいける
大まかな流れ
17
.Rmd (R Markdown)
knitr パッケージ
.Rhtml (R HTML)
.Rnw (TeX+R)
※reStructuredTextなんかもイケる ※正確に言うと、knitrパッケージは【R Markdown(.Rmd)】→【Markdown(.md)】を担当
.html
.docx
.md
.tex
(何らかの処理挟むこと屡)
等
R+本文(HTML, MarkDown等)
.Rnwファイルの処理法
18
2つの処理法がある
※Rstudioの設定画面(【Tools】→【Options】)
knitr/Sweaveの違い
19
knitr Rのパッケージ
処理対象
Sweave
.Rnw .Rmd .Rhtml ※knitrとSweaveでは.Rnwを処理する際に使えるchunkのオプションがちょいと違う
.Rnw/.Rmdの違い
• TeXベース(.Rnw)かMarkdownベース(.Rmd)かが違う
•できる事は.Rnwの方が多い(はず)
20
.Rnw .Rmd
※.RnwのnwはNowebの意味でそういうLiterate Programmingツールに由来するらしい
21
本題へ
まずは新規ファイルの作成
22
クリック
※Rstudioを立ち上げて【File】
デフォルトでなんか入ってる
1:ファイルを保存(UTF-8推奨)
23
2:を押す
※ファイルに変更がないと保存できないかも
結果(HTML)がプレビューされる
24
25
以下、この.Rmdファ
イルに、コードと文章を書いきます
この後(少なくとも俺は)こうしてる
•基本的に
1. (適当に)文章書いて
2. 間にRのコードを挟む
な感じで書いていく
•時々、[Knit HTML]押してチェック
26
.Rmd (R Markdown)
knitr .html
※もっといいやり方あったら教えてください
←行ったり来たり→
まずは基本的な書き方 • 本文の間にチャンクと呼ばれる
```{r label, option1, …., optionN} ----ここにRのコード-----
```
を書き、Rのコードを埋め込んでいく
(label・optionはIDと処理のオプション)
• .Rhtmlでも.Rnwでも基本こんな感じ (Chunkの開始・終了タグがちょいと違うだけ)
27
まずは基本的な書き方
•以下の内容を.Rmdファイルに追記
28
やぁ、みんなこんにちは!
ぼくのRのversionは
```{r my_r_version, warning=TRUE}
R.version.string
``` ダヨ!!!
Chunkのlabel. ID的なもん
Chunkのオプション的なもん
Ch
un
k
Rのコード
まずは基本的な書き方
• [Knit HTML]ボタン押すと以下のような、出力が得られる
29 ※宗教上の理由で古いRを使っております
アドバイス
• Chunkのlabelは同/別のファイルか
ら参照する際に使用されるんで、なくてもOKだが、必要ならちゃんとつけとけ。chunkの共有・参照に便利
• Chunkのオプションはたくさんあるか
ら、使いそうなもんだけ覚えておけ(後述)
30
インラインChunk
•以下の内容を.Rmdファイルに追記
31
carsデータに関する回帰分析だーっ!
```{r lm_result}
x <- lm(dist~speed, data=cars)
``` この結果、回帰係数の切片は
`r coef(x)["speed"]`となった。
`r XXX`でインライン展開されるchunkになる
インラインChunk
•文章中に結果が埋め込まれる
•結果を適当な変数に入れておけば、文章だけ先に用意することも可能
32
数式の追加
•以下の内容を.Rmdファイルに追記
33
数式も表示できるヨ!!
$でインラインな数式$f(x) = ax^2 + bx + c$、
$$で1行まるごと数式
$$f(x) = ax^2 + bx + c$$
TeX記法を用いる
数式の追加
•実行結果(HTML)
• mathjaxを用いて描画されている
34
表の追加 • resultsオプションに、”そのまま出力”を意味する’asis’を指定
• knitr内のkable関数を使用(xtableも可) • format=“markdown”でpandoc用
markdownテーブルへ出力可
35
```{r table1, results='asis'}
x <- lm(dist ~ speed, data=cars)
kable(summary(x)$coef, format="html",digits=2)
```
※その他、panderパッケージなるものを使う手もある
表の追加
•表の”見てくれ”を変えたい場合は、HTML表示の際に使われるcssファイルを変える必要あり(※)
36 ※参照:http://www.slideshare.net/wdkz/rstudio-13866958
図の追加 • 単純にPLOT関数を書けばOK
• fig.(width|height)には出力(Not 張付)画像サイズをインチ単位で指定
• fig.capオプションに文字列を指定すると図のキャプションも入る(Word等時)
37
```{r plot_cars, fig.width=5, fig.height=4}
plot(cars)
```
図の追加
38
図の追加
• ggplot2なんかもOK
39
```{r plot_iris, fig.width=5, fig.height=4}
library(ggplot2)
qplot(Sepal.Length, Sepal.Width, data
=iris, colour=Species)
```
図の追加
40
グローバルにオプション指定
• 毎回chunkにオプション書くのめんどい
• opts_chunkで全体に対して一括でオプションを指定できる
41
```{r global_option, eval=FALSE} #opts_chunk$setで指定したものは、
#全体に設定されるので以降指定しなくてOK
opts_chunk$set(fig.width=6, fig.height=6)
```
その他のオプションについて
42 R markdown(knitr)パッケージのchunk optionまとめ
http://d.hatena.ne.jp/teramonagi/20130615/1371303616
基礎編のまとめ
• とりあえずHTMLで
–Rの基本的な実行結果
–図・表・数式
が出力できるようになった!
• レポートをHTMLで作成していいならこれで大体OK
•オプションは必要に応じてググれ
43
本文を書く際に使える
Markdownのクイックリファレンス
44
Markdownの
クイックリファレンスが開くクリック
※見出し、フォント等の設定法が書いてある。最新版のRStudioだとちょい見てくれ違う
R MarkdownでReproducible Research
応用編
45
応用編
•もうちょっと”凝った”ものを作るためのテクニック的なもの
•俺が悩んで酷い目にあったものへの対処法
…を紹介
46
Chunkオプションの条件化
• ChunkオプションにはRの変数や関数の結果を代入することが可能
•例:xが3より大きい場合のみchunkを評価
47
```{r conditionalchunk_eval, eval=(x>3)} print("x は3より大きい")
```
※ 図の番号をつけるのとかにも使える ※参照:https://github.com/yihui/knitr-examples/blob/master/070-caption-num.Rmd
スクリプトの共有 • read_chunk関数により、Rで書いた他のファイルを取りこむことが可能
• 以下の内容のファイルが”share/shared.R”として保存してあると仮定
48
## @knitr plus10r plus10 <- function(x){
x+10
}
plus10(3)
## @knitr subset_iris
subset(iris, Sepal.Length>7.6)
スクリプトの共有
49
```{r read_shared_r}
read_chunk("share/shared_r.R")
```
```{r plus10r}
```
.Rmdの例 その出力結果
shared_r.R内の関数が ## @knitr plus10r という書式で指定されたラベルで実行できる!
.Rmdファイルの分割
•以下のような内容の.Rmdを作成
(share/shared_rmd.Rmdとした)
•別の.Rmdでchildオプションで指定
50
```{r child_rmd} print("これは別ファイルに記述されたR Markdownです")
```
```{r child1, child="share/shared_rmd.Rmd"}
```
.Rmdファイルの分割
• .Rmdが展開(本文)され、chunkも実行される
•複数人で書く、あるいは章ごとに分けるなどの際に便利
51
他の言語、突っ込む
• engineオプションを指定することで、他の言語(python, ruby, sed, awk, haskell, SAS, perl)をchunkとして突っ込める
•更に、Rcppを指定するとRcppのコードを書く事も可能
52
```{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));
}
```
他の言語、突っ込む(Rcpp)
• フィボナッチ数列計算関数作成
53
```{r r use_rcpp} #Rcppで作成した関数を使用
fibCpp(10)
```
他の言語、突っ込む(Rcpp)
•作成した関数を.Rmd内部で使用
54
他の言語、突っ込む(python)
• フィボナッチ数列計算関数作成&実行
55
```{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)
```
他の言語、突っ込む(python)
• HTMLとして出力すると、ちゃんとソース+実行された結果が返ってくる
56
Chunkのエイリアス
• Chunkオプションには、略記のための”別名”を付けることも可能
57
```{r}
set_alias(w = "fig.width", h = "fig.height")
```
```{r w=7, h=6}
plot(cars)
```
※正確にはchunkオプション以外にPackageオプションがあり、aliasはその1つ
コードをAppendixに載せる
58
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が引ける
コードをAppendixに載せる
59
テンプレートからの作成 • Rのソースコードを雛型として、一気に定型レポート作成する関数もあり
–spin: .R ---> .md
–stitch: .R ---> .md/.html/.pdf(*1)
• spinは変換のみ
• stitchは簡単なレポートのテンプレートまで作ってくれる(*2)
60
※1: 日本語環境だとpdf生成は、相当頑張って設定しないとキツいとおもう… ※2: デフォルトのテンプレートだとsessioninfo, ファイルの生成時間を自動で付けてくれたりする。テンプレートは指定可能。
テンプレートからの作成
• spin関数、RStudioから即使えます
61
こいつをポチる
テンプレートからの作成
• spin関数による変換結果
62
さて、
63
日本を支える
ビジネスマンの皆さん
64
鬼門です
65
鬼門
66
すぐに Word
で報告書を作成して
手で図・表の結果をWord貼り付ける… 枚数によっては
67 ※VBA使ってもしんどい
Word/PDFで出力したい
• Pandocを使って、knitrの出力(Markdown)をWord/PDFへ変換する方向で
• knitrから直接変換できるものの、日本語が入ると正直キツい
• これは試行錯誤の末の一案なので、だれかもっといいやり方あったら教えて…
68
ドキュメント変換のルート
69
.html
.docx
.md
.tex
.Rmd knitr
markdown
pandoc
pandoc TeX (LuaLaTeX)
基礎編のルート
ドキュメント変換に向けて
• HTML以外にするためには、ある程度knitrが中でどんな動きをしているのかを知っておくのが得策
• というわけで、[Knit HTML]ボタンを押した場合の挙動をちょいと紹介
70
[Knit HTML]ポチった時の動作
71
.Rmd (R Markdown)
knit関数 (knitrパッケージ)
.md (Markdown)
.html (HTML)
markdownToHTML関数 (markwodnパッケージ)
※実際はRstudio内部にあるMarkdownからHTMLにする内部関数が使われてるらしい
[Knit HTML]ポチった時の動作
•模倣するには、以下のように書く
72
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")
ドキュメント変換の指針
•なんで、knit関数を使って、Markdown(.md)を作成した後、これをmarkdownパッケージ経由でHTMLにはせずに、Word/PDFに“変換”する方法を取る
•その”変換”にはpandocを使用
73
ドキュメント変換の際の注意 • HTMLでチェックしつつ、Markdownに持って行こうと思う場合、表の形式をHTML⇔Markdownで切り替える必要がある
• とりあえず、以下のようなコードを、.Rmdの頭に書くようにしておいた
74
```{r table_format}
table.format <- ifelse(exists(“table.format”), table.format, “html”)
```
※参考程度に後述するhookってのを使うのもあり
Wordへの変換
• こんな感じでいけます
• pandocはRのpandoc関数で召喚
• tableがmarkdownになるように設定
75
```{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/)
Wordへの変換結果
76
からの、罠 •僕のWord数式が文字化ける
77 ※Word 2007だけかも?手元に環境がないのでよくわからない
数式の文字化け修正
• 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
82
やったね!
図・表の1,000枚程度、
ドンと来い
PDFで出力したい • [.md]→[.tex]→[.pdf]とTeX経由でPDFへ • 以下のような”おまじない”でPDFになります • コマンドプロンプトで「pandoc –D latex」と打って出る結果が、デフォルトのTeXのテンプレートになるので、スタイル変更したい場合は、適当に改変する必要有(*)
83
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/)
PDFで出力したい
84
ごちゃごちゃ面倒だし、WordをPDFで名前付けて保存でいいや
※あくまで私見です
この資料で全く解説してない内容
• hookというknitr内で行われるR Markdown処理の拡張方法がある
–chunkオプションを拡張する事ができる
–Chunkの処理(前後)に好きな処理を挟むことが出来る
• “knit_hooks”で調べると良い
85 ※正確にはchunk hooksとoutput hooksがある ※render_XXX(関数を調べるとよい
変換周りはPandocのマニュアル嫁
87
http://johnmacfarlane.net/pandoc/README.html
Pandocの日本語ユーザーズマニュアル有
88 @sky_y氏多謝!!!( http://sky-y.github.io/site-pandoc-jp/users-guide/)
Enjoy!!! 89
参考書籍
90
Dynamic Documents with R and knitr
どちらかというとLaTeXというか.Rnwの話題が多い
参考スライド
91
そろそろRStudioの話でもしてみようと思う
http://www.slideshare.net/wdkz/rstudio-13866958
参考スライド
92
RStudio事始め
http://www.slideshare.net/TakashiYamane1/rstudio
参考スライド
93
RでReproducible Research
http://www.slideshare.net/sfchaos/rreproducible-research-13569000
参考サイト
95 https://github.com/yihui/knitr-examples
参考サイト
96 http://d.hatena.ne.jp/a_bicky/20140221/1392941055