Yakitori.R #02 (fukuoka.R #16)
xaringanパッケージの内容をちょっとだけfukuoka.R / Yakitori.Rkazutan2019-10-11
View Slide
今⽇のお話xaringanパッケージとは実はエグい実装その1実はエグい実装その22 / 17
xaringanパッケージとはR NinjaことYihui作のパッケージ基本的な情報R Markdownでスライドを作成できるremark.jsというライブラリを活⽤気付いたら世界各地で流⾏ったこのスライドもそうです特徴renderが軽量chunkの評価は別リアルタイムで編集をPreviewできる他のRmdスライドテンプレートとはちょいちょい書き⽅が違う例えばスライド区切りが だったり3 / 17
xaringan、内部的にはかなりエグいremark.jsを利⽤しているremark.jsはmarkdown記法の⽂字列を読み込んでスライド化実はこれが問題となる(後述)R Ninjaは「隠れ蓑の術」でクリアしたリアルタイム編集(markdownレンダリング)本来R MarkdownはrenderしないとViewerに出せないR Ninjaはこれを「無限⽉読」(個⼈的には千⾥眼?)でクリアした今⽇はこのあたりを簡単に紹介4 / 17
おさらい: R Markdownの処理詳しくは以下の記事を参照: R Markdownの内部とテンプレート開発https://kazutan.github.io/TokyoR61/intoTheRmarkdown_d.htmlR Markdownの流れ系>系>.md pre_processorhtml, docs,pdf...output_formatpost_processorPandoc.Rmdフォーマットテンプレpre_knit.mdoutput_formatpost_knitknit5 / 17
忍法「隠れ蓑の術」課題1remark.jsはmarkdown記法を対象とするけど、Pandocを通すと強制的にhtmlにされてしまう。どうしたらいいか?R Ninjaの回答スライドに表⽰させるドキュメント部分をバイパスさせればいいは?6 / 17
忍法「隠れ蓑の術」 コード部分(1)バイパスさせるために、⼀時ファイルを準備https://github.com/yihui/xaringan/blob/master/R/render.R#L84コメントでも書いてますねtmp_md = tempfile('xaringan', fileext = '.md') # store md content here (bypass Pandoc7 / 17
忍法「隠れ蓑の術」 コード部分(2)以下の処理をpre_processorとして準備Rmdファイルからyamlとbodyを分離させるbody部分をさっきの添付ファイルに書き込むhttps://github.com/yihui/xaringan/blob/master/R/render.R#L172-L185pre_processor = function(metadata, input_file, runtime, knit_meta, files_dir, output_dir) {res = split_yaml_body(input_file)write_utf8(res$yaml, input_file)res$body = protect_math(res$body)content = htmlEscape(yolofy(res$body, yolo))Encoding(content) = 'UTF-8'write_utf8(content, tmp_md)c(if (seal) c(' variable', 'title slide=true'),if (!identical(body, res$body)) c(' variable', 'math=true'))},8 / 17
忍法「隠れ蓑の術」 コード部分(3)pandocによる変換処理の後に、Pandocの挿⼊機能を使って差し込むhttps://github.com/yihui/xaringan/blob/master/R/render.R#L119-L138html_document2 = function(, includes = list(), mathjax = 'default', pandoc_args = NULL) {if (length(includes) 0) includes = list()includes$before_body = c(includes$before_body, tmp_md)includes$after_body = c(tmp_js, includes$after_body)実際には細かい調整とかしてるけど、⼤まかにはこんな感じです9 / 17
忍法「無限⽉読」課題2どうやってリアルタイムレンダリングしてるの?R Ninjaの回答こんな感じで:1. 簡易的なHTTPサーバーを起動させるservr パッケージで実現2. 必要なライブラリを送るremark.jsなど3. RmdファイルをHTTPサーバーへ送り、Viewerに表⽰させるViewerについてはこちらtubeplayRパッケージはなぜRStudio上でYouTubeを再⽣できるのか4. Rmdファイルをモニタリングし、変更を察知したらそれをサーバーへ送るrstudioapiを駆使しているremark.jsがmdを読み込むというのがポイント5. 変更を察知したら、Viewerを再読み込みさせる10 / 17
まとめR Ninjaまじすごい11 / 17
おまけ12 / 17
13 / 17
14 / 17
15 / 17
みんなNinjaになろう16 / 17
Enjoy!17 / 17