Generating PowerPoint slides
Non-manually using R
Rでパワーポイントのスライドを手作業せずにつくりたい
第84回 R勉強会@オンライン(#TokyoR)
?誰
臨床検査事業 の なかのひと
?専門
遊牧@モンゴル(生態学/環境科学)
▼
臨床検査事業の研究所(データを縦にしたり横にしたりするしごと)
1cm
@kato_kohaku
「パワポでくれ」と言われたら
分析結果→レポーティングの風景像
 分析後にパワポを作りなおすの面倒…
 自動化したい
 報告のプレゼンしないと…
 スライド準備しないと…
×100
コピペ汚染
高橋康介『R Markdownで楽々レポートづくり』 gihyo.jp 2015年5月8日
http://gihyo.jp/admin/serial/01/r-markdown/0001?page=2
• 過誤
• コピペすべきデータや場所を間違えてしまう
• 不毛
• 大量の図・表・出力があった場合,コピペが大変。
• データやログの差し替えがあった場合,同じコピペを一から繰り返す必要がある
• 迷子
• あのデータ、どこにいった?
• どのスクリプトを使ったっけ?
• たとえば「この図の出力に使った解析アルゴリズムを教えて欲しい」と言われても,レポートからスクリプトはト
レースできません。
RによるPowerPoint資料の自動生成
1. RmarkdownをRstudioでknit
• ひととおりのプレゼンスライド生成と、ある程度のカスタマイズは可能
• スライド生成が簡単にできる
2. {export} package
• Rの図表オブジェクトを、パーツとしてスライドに出力する
• PPT以外の出力も含めて操作が簡単なかわり、自由度はあまりない
• CRAN凍結中
3. {officer} package
• かなり自由にプレゼンスライド生成の生成と編集が可能
「パワポでくれ」と言われたら
To Get ALL Resources
Please see my GitHub repos.:
• https://github.com/katokohaku/powerpoint_with_officer
• このスライドも自動生成できたらよかった…
Rmarkdown を Rstudio で knit (1)
① File → New File → R Markdown
② Presentation → ☑ PowerPoint
③ Knit▼ → Knit to PowerPoint
パワポを作りたい①
① ②
Rmarkdown を Rstudio で knit (2)
③ Knit▼ → Knit to PowerPoint
パワポを作りたい①
③
Rmarkdown を Rstudio で knit (3)
パワポを作りたい①
• デフォルトのテンプレートが割とよく出来ているので、これを修正するだけでも結構何とかなる。
{export} package
• 図表オブジェクトを、様々なファイル形式で出力してくれる(だった)
• {officer}のアップデートに対応してないためCRAN凍結中。
• 上記の理由で旧バージョンを入れても動作しない。
パワポを作りたい②
1. 基本的な考え方と手順
2. つかってみる:テキスト・図表のスライドへの埋め込み
3. PowerPointの構造 ~ レイアウトとプレースホルダ
4. レイアウトにあわせたテンプレートの作成
5. 自分で作ったスライド用のテンプレートを作る
本日の話題
{officer} packageを使った 柔軟なスライド生成
パッケージ構成
{officer} packageを使ったPowerPointの生成
パッケージ構成
{officer} packageを使ったPowerPointの生成
プレゼンテーションの作成
スライドに設置できる
コンテンツの種類
コンテンツの
設置先の指定
操作中のスライドの
構成情報の取得
スライド・プレースホルダの
操作
PowerPointの構造
スライドマスター
• すべてのレイアウトのスライドに、共通した設定を行う仕組み
レイアウト
• スライド上のプレースホルダを様々なパターンで配置した集合
• 各スライド上の、プレースホルダの配置や書式に一貫性を保証するための
仕組み
プレースホルダ
• スライドレイアウト上に配置されている、コンテンツを配置するための枠
PowerPointの用語
PowerPointの構造
PowerPointの用語
スライドマスター1
レイアウトA
レイアウトB
プレースホルダ①
プレースホルダ②
表示 → スライドマスター 、から確認
プレースホルダ①
プレースホルダ②
参考図書
https://gihyo.jp/book/2017/978-4-7741-9183-6
 Chapter6 レイアウトのセオリー
基本手順
{officer} packageを使ったPowerPointの生成
プレゼンレーションの初期化
read_pptx()
スライドの追加
add_slide()
コンテンツの設置
ph_with()
コンテンツの設置先の指定
ph_location**
プレゼンレーションの出力
print(..., target = “XX.pptx)
必須の操作
スライドの作成・編集
設置するコンテンツの指定
図表・テキスト等のオブジェクト
基本的には、
追加したスライド上で
プレースホルダにコンテンツを設置
の繰り返し
基本操作
{officer} packageを使う
基本操作
{officer} packageを使う
基本操作:Pipe-chain friendly
{officer} packageを使う
(参考) 既存のテーマをつかう
初期化ファイルの指定
{officer} packageを使う
1. 基本的な考え方と手順
2. つかってみる:テキスト・図表のスライドへの埋め込み
3. PowerPointの構造 ~ レイアウトとプレースホルダ
4. レイアウトにあわせたテンプレートの作成
5. 自分で作ったスライド用のテンプレートを作る
本日の話題
{officer} packageを使った 柔軟なスライド生成
いろいろなコンテンツの設置
• スライド %>% ph_with(オブジェクト, 場所の指定) が基本操作
• 様々なオブジェクトを埋め込める
• テキストやベクトル
• data.frame
• flextable
• 画像ファイル
• ggplot
• editable graphics
• 書式のカスタマイズ
テキスト や ベクトル
• スライド %>% ph_with(オブジェクト, プレースホルダの指定) が基本操作
いろいろなコンテンツの設置
value location
テキスト や ベクトル
• スライド %>% ph_with(オブジェクト, プレースホルダの指定) が基本操作
いろいろなコンテンツの設置
value location
data.frame
いろいろなコンテンツの設置
flextable
いろいろなコンテンツの設置
画像ファイル
いろいろなコンテンツの設置
ggplot
いろいろなコンテンツの設置
ggplot
いろいろなコンテンツの設置
ggplot
• スライド全体に拡大もできる
いろいろなコンテンツの設置
editable graphics
• ggplotオブジェクト + rvg::dml() で、編集可能なオブジェクトが埋め込める
• R Graphics Devices for Vector Graphics Output for DrawingML plotting in Powerpoint
• 生成したXMLのレンダリングに ph_with() を必要とするため、実質的にofficerの専属パッケージ
いろいろなコンテンツの設置
editable graphics
• ggplotオブジェクト + rvg::dml() で、編集可能なオブジェクトが埋め込める
• R Graphics Devices for Vector Graphics Output for DrawingML plotting in Powerpoint
• 生成したXMLのレンダリングに ph_with() を必要とするため、実質的にofficerの専属パッケージ
いろいろなコンテンツの設置
グループ化
を解除
段落・書式のカスタマイズ
いろいろなコンテンツの設置
いろいろな組み合わせ
• プレースホルダのカスタマイズによって、スライド上に任意のレイアウトを作成できる →この資料の後半で解説
• ファイルとして保存して読み込むことで、テンプレートとしても使用できる
1. 基本的な考え方と手順
2. つかってみる:テキスト・図表のスライドへの埋め込み
3. PowerPointの構造 ~ レイアウトとプレースホルダ
4. レイアウトにあわせたテンプレートの作成
5. 自分で作ったスライド用のテンプレートを作る
本日の話題
{officer} packageを使った 柔軟なスライド生成
PowerPointの構造
PowerPointの用語
スライドマスター1
レイアウトA
レイアウトB
プレースホルダ①
プレースホルダ②
表示 → スライドマスター 、から確認
プレースホルダ①
プレースホルダ②
基本手順+オプション
{officer} packageを使ったPowerPointの生成
プレゼンレーションの初期化
read_pptx()
スライドの追加
add_slide()
コンテンツの設置
ph_with()
パラグラフ・書式の修飾
fpar(), ftext()
コンテンツの設置先の指定
ph_location**
プレゼンレーションの出力
print(..., target = “XX.pptx)
スライドの操作
*_slide()
プレースホルダの操作
ph_**()
必須の操作
オプションの操作
スライドの作成・編集
スライドの構成情報を
確認しながら作業
設置するコンテンツの指定
図表・テキスト等のオブジェクト
スライドマスター・レイアウトの指定
既存のPowerPointファイルの指定
レイアウトとプレースホルダ(1)
• スライドレイアウトごとに、プレースホルダの配置が異なる
• Officerパッケージに用意されているデフォルトテンプレートファイルは、以下のようなレイアウト構成
レイアウトとプレースホルダ(2)
• レイアウト上のプレースホルダ配置の確認
プレースホルダのタイプ プレースホルダのラベル名
プレースホルダの
位置とサイズ
レイアウトとプレースホルダ(2)
• レイアウト上のプレースホルダ配置の確認
プレースホルダの指定(1)
• プレースホルダを含むスライドを追加する
プレースホルダの指定(2)
• レイアウト上のプレースホルダの指定には、タイプ・ラベル名・位置を指定する方法がある
プレースホルダの
位置とサイズ
ph_location_type() :設置先のプレースホルダのタイプを指定
ph_location_label() :設置先のプレースホルダのラベル名を指定
ph_location_fullsize() :スライドのサイズに合わせる
ph_location_left() :”TwoContent”レイアウト用(左)
ph_location_right() :”TwoContent”レイアウト用(右)
ph_location() :新しいプレースホルダを追加する
プレースホルダのタイプ プレースホルダのラベル名
タイプで指定
• ph_location_type()で、プレースホルダのタイプを指定する
• レイアウト内に同じタイプのプレースホルダが複数あった場合、いちばん小さいインデクスに設置される
プレースホルダの指定
タイプで指定
• ph_location_type()で、プレースホルダのタイプを指定する
• レイアウト内に同じタイプのプレースホルダが複数あった場合、いちばん小さいインデクスに設置される
プレースホルダの指定
ラベル名で指定
• ph_location_type() の仕様上、‘body’, ‘title’, ‘ctrTitle’, ‘subTitle’, ‘dt’, ‘ftr’, ‘sldNum’ 以外のタイプをサポートしない
→ それ以外のプレースホルダは、ph_location_label() や ph_location () で指定する
• ph_location_label()で、プレースホルダのラベル名を指定する
• レイアウト内に同じラベル名のプレースホルダが複数あった場合、いちばん小さいインデクスに設置される
プレースホルダの指定
スライドのサイズに合わせる
• ph_location_fullsize() で指定する
プレースホルダの指定
二段組みレイアウト専用
• ph_location_left() と ph_location_right() で左右のコンテンツを指定できる
プレースホルダの指定
任意の位置サイズのプレースホルダの作成
• ph_location() で、新しいプレースホルダの設置位置・サイズ・背景色・回転角を指定できる
プレースホルダの指定
任意の位置サイズのプレースホルダの作成
• プレースホルダのカスタマイズによって、スライド上に任意のレイアウトを作成できる
• ファイルとして保存して読み込むことで、テンプレートとしても使用できる
1. 基本的な考え方と手順
2. つかってみる:テキスト・図表のスライドへの埋め込み
3. PowerPointの構造 ~ レイアウトとプレースホルダ
4. レイアウトにあわせたテンプレートの作成
5. 自分で作ったスライド用のテンプレートを作る
本日の話題
{officer} packageを使った 柔軟なスライド生成
特定のレイアウトのテンプレート化(1)
• 特定のレイアウトのスライドを自動生成したい
• 特定のレイアウトのすべてのプレースホルダにアクションを定義すればよい
特定のレイアウトのテンプレート化(2)
• 特定のレイアウトのスライドを自動生成したい
• 特定のレイアウトのすべてのプレースホルダにアクションを定義すればよい
各プレースホルダに対応するコンテンツ
各プレースホルダに対応するアクション
特定のレイアウトのテンプレート化(2)
• 特定のレイアウトのスライドを自動生成したい
• 特定のレイアウトのすべてのプレースホルダにアクションを定義すればよい
各プレースホルダに対応するコンテンツ
各プレースホルダに対応するアクション
特定のレイアウトのテンプレート関数化(3)
• 特定のレイアウトのスライドを自動生成したい
• 特定のレイアウトのすべてのプレースホルダにアクションを定義すればよい
• プレースホルダとオブジェクトのペアで、コンパクトにスライドを作りたい。
各プレースホルダに対応するコンテンツ
各プレースホルダに対応するアクション
特定のレイアウトのテンプレート関数化(3)
• 特定のレイアウトのスライドを自動生成したい
• 特定のレイアウトのすべてのプレースホルダにアクションを定義すればよい
• プレースホルダとオブジェクトのペアで関数化してコンパクトに。
1. 基本的な考え方と手順
2. つかってみる:テキスト・図表のスライドへの埋め込み
3. PowerPointの構造 ~ レイアウトとプレースホルダ
4. レイアウトにあわせたテンプレートの作成
5. 自分で作ったスライド用のテンプレートを作る
本日の話題
{officer} packageを使った 柔軟なスライド生成
レイアウトのカスタマイズ(0)
1. 表示 → スライドマスター → レイアウトの挿入 → プレースホルダの挿入
2. ホーム → 選択 → オブジェクトの選択と表示
• 各プレースホルダーの名前とレイアウトの名前を重複しないように変更
3. スライドマスター → マスター表示を閉じる → ファイル → 保存
ラベル名が重複しないように設定する
カスタマイズしたレイアウトをテンプレート化(1)
• 特定のレイアウトのスライドを自動生成したい
• 特定のレイアウトのすべてのプレースホルダにアクションを定義したい
このレイアウトには、
同じtypeのプレースホルダが複数ある
重複していないラベル名を使って
プレースホルダーを識別・指定すればよい
カスタマイズしたレイアウトをテンプレート化(2)
• 特定のレイアウトのスライドを自動生成したい
• 特定のレイアウトのすべてのプレースホルダにアクションを定義すればよい
各プレースホルダに対応するコンテンツ
各プレースホルダに対応するアクション
カスタマイズしたレイアウトをテンプレート化(2)
• 特定のレイアウトのスライドを自動生成したい
• 特定のレイアウトのすべてのプレースホルダにアクションを定義すればよい
各プレースホルダに対応するコンテンツ
各プレースホルダに対応するアクション
カスタマイズしたレイアウトをテンプレート関数化(2)
• 特定のレイアウトのスライドを自動生成したい
• 特定のレイアウトのすべてのプレースホルダにアクションを定義すればよい
• プレースホルダとオブジェクトのペアで、コンパクトにスライドを作りたい。
各プレースホルダに対応するコンテンツ
各プレースホルダに対応するアクション
カスタマイズしたレイアウトをテンプレート化(2)
• 作成したレイアウトのスライドを自動生成したい
• 特定のレイアウトのすべてのプレースホルダにアクションを定義すればよい
• プレースホルダとオブジェクトのペアで関数化してコンパクトに。
参考
Rmarkdown を Rstudio で knit
• Rendering PowerPoint Presentations with Rstudio
• https://support.rstudio.com/hc/en-us/articles/360004672913-Rendering-PowerPoint-Presentations-with-RStudio
• RStudioとRMarkdownで作るPowerPointプレゼンテーション
• https://qiita.com/nozma/items/bbd681490b2aaaf9ec93
•
{export} package
• Rで作成した図表を「パワポでくれ」と言われた時の対処法
• https://kato-kohaku-0.hatenablog.com/entry/2019/12/19/222429
•
{officer} package
• PowerPoint presentations generation @official
• https://davidgohel.github.io/officer/articles/offcran/powerpoint.html
• Function reference
• https://davidgohel.github.io/officer/reference/index.html
References

How to generate PowerPoint slides Non-manually using R