R Markdownのhtml_document
などでHTMLドキュメントを作成すると、デフォルトではグラフなどの画像もHTML内に埋め込んでくれます。
これは、rmarkdown::html_document(self_contained = TRUE)
に相当する出力だからです。
YAMLフロントマターでself_contained
をfalse
にすると、画像ファイルなどを別ファイルに出力してくれます。
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