読者です 読者をやめる 読者になる 読者になる

データサイエ「ソ」ティストは語る

データサイエンティストではない、パチもんのデータサイエ「ソ」ティストのブログ

RからPowerPointを操作して自動レポート作成環境を作る(2)Rのグラフやデータフレームを挿入する

前回の記事

datasciesotist.hatenablog.jp

(1)では、RからPowerPointを起動し、スライドの作成、テンプレートの適用までを紹介した。(2)では、スライドにRのグラフやデータフレームなどを挿入する方法を紹介する。

R2PPTパッケージが提供する関数

まずは、R2PPTパッケージが提供する関数を一覧する。といっても、(マニュアルには)13個しか関数はないし、名前が直感的なので、関数名を見ればだいたい用途はわかるだろう。

関数名 用途 用例
PPT.Init PowerPointオブジェクトの初期化 myPPT<-PPT.Init(visible=T,method="RDCOMClient")
PPT.Open 既存のPowerPointファイルを開く myPPT<-PPT.Open(file="",method="RDCOMClient")
PPT.AddTitleSlide 「タイトルスライド」レイアウトのページを作成する myPPT<-PPT.AddTitleSlide(myPPT,title="",subtitle="")
PPT.AddTitleOnlySlide 「タイトルのみ」レイアウトのページを作成する myPPT<-PPT.AddTitleOnlySlide(myPPT,title="")
PPT.AddTextSlide 「タイトルとテキスト」レイアウトのページを作成する myPPT<-PPT.AddTextSlide(myPPT,tilte="")
PPT.AddBlankSlide 「白紙」レイアウトのページを作成する myPPT<-PPT.AddBlankSlide(myPPT)
PPT.AddGraphicstoSlide アクティブなページにグラフィックスを追加する Rのアクティブなグラフィックスデバイスから貼り付ける
myPPT<-PPT.AddGraphictoSlide(myPPT,size="")
ファイルを指定して貼り付ける
myPPT<-PPT.AddGraphicstoSlide(myPPT,file="")
PPT.AddDataFrame データフレームをOLEオブジェクト(Excel表と同様)として貼り付ける myPPT<-PPT.AddDataFrame(myPPT,df="")
myPPT<-PPT.AddDataFrame(myPPT,df="",row.names=F)
PPT.ApplyTemplate スライドにテンプレート(*.potx)を適用する myPPT<-PPT.ApplyTemplate(myPPT,file="")
PPT.SaveAs 「名前を付けて保存」する myPPT<-PPT.SaveAs(myPPT,file="")
PPT.Close PowerPointファイルを閉じる myPPT<-PPT.Close(myPPT)
PPT.Present プレゼンテーションモードで表示する myPPT<-PPT.Present(myPPT)
PPT.getAbsolutePath 指定したファイルの絶対パスを得る PPT.getAbsolutePath(pathname="")

PowerPointオブジェクトを生成し、適当なページを作成する

本題の、「スライドにRのグラフやデータフレームを挿入する」ために、まずは適当なスライドを作る。基本的には前回記事の通り。

> myPPT<-PPT.Init(visible=T,method="RDCOMClient")
> myPPT<-PPT.AddTitleSlide(myPPT,title="PowerPointにRのグラフやデータフレームを挿入するテスト",title.fontsize=28)

Rで作成したグラフを貼り付ける

スライドのページにRで作成したグラフを貼り付けるには、上記のようにPPT.AddGraphicstoSlide関数を使う。この関数は、オブジェクト内の“現在アクティブなページ”(ようは、最後にmyPPTオブジェクトに代入された関数の実行結果)にグラフを挿入するので、「とりあえずページを作っておいて、後からグラフを挿入」というのはできないようだ。ページを作る→グラフを挿入→次のページを作る、という流れで処理する必要がある。

グラフ自体はなんでもよいので、「みんな大好きirisデータ」から作った箱ひげ図を使うことにする。

> data(iris) # データを読み込む
> head(iris) # データを確認しているだけ
> boxplot(iris[,1:4]) # irisデータの1列目から4列目を箱ひげ図でプロット

f:id:data_sciesotist:20160704231220p:plain

PPT.AddGraphicstoSlide関数には、現在開いているグラフィックスデバイスのデータを貼り付ける機能と、任意のファイルの内容を貼り付ける機能があるが、まずはグラフィックスデバイスのデータを貼り付ける。

> myPPT<-PPT.AddTitleOnlySlide(myPPT,title="グラフを挿入するためのページ")
> myPPT<-PPT.AddGraphicstoSlide(myPPT)

すると、以下のようにページにグラフが貼り付けられる……が、あまりイケてない。

f:id:data_sciesotist:20160704232037p:plain

グラフ全体が横に引き伸ばされた形で貼り付けられてしまう。これは、PPT.AddGraphicstoSlide関数のsizeオプションのデフォルトがsize=c(10,10,700,500)(左端からの距離、上端からの距離、幅、高さ)となっているためで、size=c(10,10,500,500)とすれば、デフォルトのグラフィックスデバイスの縦横比と同じ正方形で貼り付けられる。

> myPPT<-PPT.AddGraphicstoSlide(myPPT,size=c(10,10,500,500))

f:id:data_sciesotist:20160704234012p:plain

また、上記の記述ではグラフィックスは編集しようがない画像(デフォルトはJPEG形式)で貼り付けられているが、dev.out.typeオプションでemfを選択すると、PowerPointに貼り付け後に編集ができるようになる。これはけっこう便利。

> myPPT<-PPT.AddGraphicstoSlide(myPPT,size=c(10,10,500,500),dev.out.type="emf")

f:id:data_sciesotist:20160704233300p:plain

これはこれで、オブジェクトのサイズに比して画像のサイズが変だが、オブジェクトを右クリックし、「図の編集」を選ぶと、ラベルの文字列や色、線の太さなどをPowerPoint上で編集できる。下は、オブジェクトを適当に編集している様子。

f:id:data_sciesotist:20160704233749p:plain

もちろん、ggplot2パッケージで作成したグラフも貼り付けられる。

> require(ggplot2)
> qplot(Sepal.Length,Petal.Length, data=iris, color=Species)
> myPPT<-PPT.AddGraphicstoSlide(myPPT)

f:id:data_sciesotist:20160704234346p:plain

ということで、Rで作成したグラフは、PPT.AddGraphicstoSlide関数で(まぁまぁ)簡単に貼り付けることができる。

Rのデータフレームを貼り付ける

次に、データフレーム(いわゆる表)をPowerPointに貼り付ける。これも、PPT.AddDataFrame関数で容易に実現できる(何でこの関数はPPT.AddDataFrametoSlideじゃないのだろうか)。また、irisデータを使う。

> head(iris)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa

このデータを貼り付けるため、以下のコードを実行する。

> myPPT<-PPT.AddTitleOnlySlide(myPPT,title="データフレームを挿入するためのページ")
> myPPT<-PPT.AddDataFrame(myPPT,head(iris))

これもやはり、縦横比がイケてない感じになる。

f:id:data_sciesotist:20160704235456p:plain

グラフィックスの場合と同様に、sizeオプションが微妙な数値になっているためで、size=c(10,100,500,300)といったようにすると、多少見栄えが良くなる。

f:id:data_sciesotist:20160704235818p:plain

とはいえ、最適なサイズをトライアンドエラーで探すのは面倒だ。データフレームに関しては、いちどクリップボードにコピーしてExcelに貼り付け、体裁を整えてからさらにPowerPointに貼り付けるほうが楽かもしれない。

# クリップボードにタブ区切りでコピー
> write.table(head(iris),"clipboard",sep="\t",row.names=F,quote=F)

「自動レポート作成環境を作る」という観点では、毎回のレポートで出力する行・列の数が決まっているのなら、いちどがんばって最適なサイズを探せば、後はその値を使い続ければよいだろう。

いちおう、PPT.AddDataFrame関数で貼り付けたデータフレームはOLEオブジェクトになっており、表をダブルクリックするとExcelが起動し、内容を編集できる。

f:id:data_sciesotist:20160705000202p:plain

ということで、Rのデータフレームは、PPT.AddDataFrame関数で(まぁまぁ)簡単に貼り付けることができる。

まとめ

  • PPT.AddGraphicstoSlide関数でグラフィックスをPowerPointに貼り付けられる
  • PPT.AddDataFrame関数でデータフレームをPowerPointに貼り付けられる

実際のところ、R2PPTパッケージの主な関数はこの2回で紹介したものくらいなので、おそらく(3)はないものと思われる。あるとしたら、何か1件ケーススタディっぽいものを取り上げるかもしれない。

取り上げるが・・・・・・今回 まだその時と場所の指定まではしていない そのことをどうか諸君らも思い出していただきたい つまり・・・・我々がその気になれば記事の作成は10年20年後という ことも可能だろう・・・・・・・・・・ということ・・・・!

おしまい。