Self containedなHTMLドキュメント生成時にiframeしたいならknitr::include_url関数を使おう

カテゴリ: r

R Markdownのhtml_documentなどでHTMLドキュメントを作成すると、デフォルトではグラフなどの画像もHTML内に埋め込んでくれます。

これは、rmarkdown::html_document(self_contained = TRUE)に相当する出力だからです。

YAMLフロントマターでself_containedfalseにすると、画像ファイルなどを別ファイルに出力してくれます。

output:
  html_document:
    self_contained: false

self_containedなHTMLドキュメントは、ファイルを人に渡すときに手軽で便利ですね。

しかし、最近のRStudioなどでR Markdownを利用すると、HTMLのiframeタグを使って他のページを取り込む時に、参照しているHTMLファイルまでself containedにしてしまいます。良さそうな響きですが、参照先がHTMLを動的に生成している場合などに問題を起こします。たとえばyoutubeのページをiframeタグで取り込むとYoutubeを再生できなくなります。

これを防ぐ簡単な方法は、iframeタグを使う代わりにknitr::include_urlを使いましょう。

```{r, echo=FALSE}
# knitr 1.34以上が必要
knitr::include_url("https://example.com")
```

より技術的な話

最近のRStudioはPandoc >= 2.11.2を採用しています。以来、self_containedな文書を生成すると、従来より広範囲のHTMLタグに対して参照先の内容の取り込みが発生します。

self_containedの例外処理を行うにはHTMLタグに対して、data-external=1を追加すればOKです。

生HTMLなら以下。

<iframe src="https://example.com" data-external=1></iframe>

htmltoolsパッケージを使ってR言語で記述するなら以下。

htmltools::tags$iframe(src = "https://example.com", `data-external` = 1)

knitr::include_url関数の場合は、上述のようなdata-external属性を自動付与してくれます。便利ですね。

参考リンク

src attribute overwritten, making iframe ineffective #2255
https://github.com/rstudio/rmarkdown/issues/2255