Advertisement

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

Quant(itative) Analyst/Developer/Researcher
Feb. 22, 2014
Advertisement

More Related Content

Slideshows for you(20)

Advertisement

Recently uploaded(20)

Advertisement

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

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