タイトルのまんまです。

やりたかったこと

R Markdownで解説ページをしていると,slideshareやspeakerdeck,あるいはrevealjsなどで作成したhtmlスライドを埋め込みたいと思うことが頻出しました。大抵のslide公開サービスだと埋め込み用のタグを生成してくれたりするのですが,どうも面倒に感じたため,色々調べたり実装したりしてみました。

成果

自分専用にコツコツ作ってきたzousanパッケージに,embed_slide()関数を準備しました。cranにはないので以下のようにインストールします:

# devtoolsの場合
devtools::install_github("kazutan/zousan")
# githubinstallでもOK
githubinstall::githubinstall("zousan")

以下のように閲覧用のurlを渡すと,html出力した際に自動で埋め込まれます:

library(zousan)
embed_slide("http://www.slideshare.net/makotohirakawa3/osakastan2-chap51")
embed_slide("https://speakerdeck.com/yamano357/tokyor49-stringr-stringi")
embed_slide("https://kazutan.github.io/methoken201702/Rmd_workshop.html#/")

解説

knitr::include_url()という関数があり,この関数にurlを渡すとそのアドレスをiframeでいい感じで埋め込むように加工してtagオブジェクトを返してくるようになってます。これを応用しました。

slideshareについて

slideshareの埋め込み用コードはわりと簡単な構造をしていて,上記のひとつ目の分なら以下のようにできます:

knitr::include_url("https://www.slideshare.net/slideshow/embed_code/key/aCQxCPihKjMxYk")

ただ,実際にこれをやろうと思うと,

  1. 公開スライドのページヘアクセス
  2. 埋め込み用のアドレスを表示
  3. それをコピー
  4. knitr::include_url()内に入れる

…となりちょっと面倒です。特に埋め込み用のurlがkeyになっててスライドタイトルが推測できなくなる,というのが苦痛でした。そこでoEmbedのAPIを利用することにしました。これの内容については以下の記事を参照してください:

slideshareはこのoEmbedに対応しています。詳しくは以下のドキュメントを参照してください:

これを利用して実装しました。

SpeakerDeckについて

SpeakerDeckの埋め込み用URLは中々に面倒で,はじめからoEmbedのAPIを利用しました:

ただ,これで取得したとしても中々うまく出力してくれず,試行錯誤してなんとか実装しました。

その他のHTMLスライドについて

revealjsなどのスライドはhtmlファイルなので,普通にknitr::include_url()でそのまま引き渡しました

実際の関数のコードについて

具体的なコードはGitHubの該当ファイルを参照してしてください:

urlを見て,slideshareのサイトならそれ用に,SpeakerDeckのサイトならそれ用にoEmbedを利用して整形してtagオブジェクトとなるようにしています。パイプ演算子つかってたりその他かなり雑ですが,今のところうまくいっているのでいいかなと。

ToDo

  • 埋め込みのサイズ調整
  • 他のプラットフォームへの対応(リクエストと技術的にいけるなら)

Enjoy!