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