Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
xaringanパッケージの内容をちょっとだけ
Search
Kazuhiro Maeda
October 11, 2019
Technology
0
1.1k
xaringanパッケージの内容をちょっとだけ
Yakitori.R #02 (fukuoka.R #16)
Kazuhiro Maeda
October 11, 2019
Tweet
Share
More Decks by Kazuhiro Maeda
See All by Kazuhiro Maeda
Will Positron accelerate us? (update)
kazutan
1
120
積もってく会議メモをどうにかしたかった
kazutan
0
250
分析システムにR Markdownを組み込む
kazutan
0
510
Rに管理されてみる
kazutan
0
460
私とR、そしてキャリア
kazutan
2
3.8k
tubeplayR v1.0への道
kazutan
2
220
R, Git, Droneを使ってconfluenceへのKPI予測レポートを自動化した話
kazutan
2
640
週次KPIレポートをconfluenceへUpするためにやったこと
kazutan
1
1.5k
最近のRパッケージ開発事情
kazutan
0
360
Other Decks in Technology
See All in Technology
「Chatwork」の認証基盤の移行とログ活用によるプロダクト改善
kubell_hr
1
240
Tech-Verse 2025 Global CTO Session
lycorptech_jp
PRO
0
1.1k
Connect 100+を支える技術
kanyamaguc
0
150
Snowflake Summit 2025全体振り返り / Snowflake Summit 2025 Overall Review
mtpooh
2
440
Should Our Project Join the CNCF? (Japanese Recap)
whywaita
PRO
0
290
AI導入の理想と現実~コストと浸透〜
oprstchn
0
150
【5分でわかる】セーフィー エンジニア向け会社紹介
safie_recruit
0
26k
Delegating the chores of authenticating users to Keycloak
ahus1
0
130
CI/CD/IaC 久々に0から環境を作ったらこうなりました
kaz29
1
200
asken AI勉強会(Android)
tadashi_sato
0
140
KubeCon + CloudNativeCon Japan 2025 Recap by CA
ponkio_o
PRO
0
240
KubeCon + CloudNativeCon Japan 2025 Recap
ren510dev
1
300
Featured
See All Featured
A better future with KSS
kneath
239
17k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
5
230
Adopting Sorbet at Scale
ufuk
77
9.4k
Art, The Web, and Tiny UX
lynnandtonic
299
21k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
Facilitating Awesome Meetings
lara
54
6.4k
The Invisible Side of Design
smashingmag
300
51k
Building a Modern Day E-commerce SEO Strategy
aleyda
42
7.4k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
48
5.4k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
50k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
45
7.5k
Building Flexible Design Systems
yeseniaperezcruz
328
39k
Transcript
xaringan パッケージの内容をちょっとだけ fukuoka.R / Yakitori.R kazutan 2019-10-11
今⽇のお話 xaringanパッケージとは 実はエグい実装その1 実はエグい実装その2 2 / 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.html R Markdown
の流れ <Pandoc 系> <knit 系> .md pre_processor html, docs, pdf... output_format post_processor Pandoc .Rmd フォーマット テンプレ pre_knit .md output_format post_knit knit 5 / 17
忍法「隠れ蓑の術」 課題1 remark.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 Pandoc 7 / 17
忍法「隠れ蓑の術」 コード部分(2) 以下の処理をpre_processorとして準備 Rmdファイルからyamlとbodyを分離させる body部分をさっきの添付ファイルに書き込む https://github.com/yihui/xaringan/blob/master/R/render.R#L172-L185 pre_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-L138 html_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