rmarkdown::html_document
関数には、self_contained
引数がFALSE
な時でも依存しているJavaScriptやCSSをポータブルにするために、extra_dependencies
引数が用意されています。本記事ではこの引数の使い方について紹介します。
使い方と何が起きるか
htmltools::htmlDependency
関数が返すhtml_dependency
クラスオブジェクトを束ねたlist
を指定します。
htmltools::htmlDependency
の使い方については、ドキュメントを参照してください。
htmltools::htmlDependency
関数に指定したJavaScriptファイルやCSSファイル、meta情報は出力されるHTMLファイルの<head>
〜</head>
の間に記述されます。
self_contained = FALSE
時は、依存対象をRmdファイルと同じディレクトリ下に配置した子ディレクトリの中にコピーし、出力されたHTMLファイルから相対パスで参照できるようにします。
子ディレクトリ名の既定値はRmdファイルの名前に_files
とサフィックスしたものです。変更するにはrmarkdown::html_document
関数のlib_dir
引数を指定してください。
どういう時に使うのか
主にrmarkdown::html_document
を拡張するフォーマットをパッケージ化する時、
JavaScriptライブラリやCSSフレームワークをパッケージに同梱し、オフラインでも利用できるようにするために用います。
どういう時に使わないのか
self_contained = TRUE
な運用しかしない時。self_contained = FALSE
な運用をするが、- 依存対象がRmdファイルから相対パスで参照しやすい範囲に依存対象が配置されている時。
includes
引数を設定すれば十分な時。- HTMLファイルにJavaScriptやCSSをべた書きしていて、強制的にself_containedされても問題ない
- 依存対象はネットワーク接続時にCDN経由で利用できれば十分
- たとえばMathJaxやKaTeXなどの数式レンダリングエンジン (参考: 先日の記事)
メモ
以下は個人的なメモ書き。
経緯
minidownパッケージを作り過程で、パッケージに同梱したCSSフレームワークをポータブルに利用できるようにしたかった。そこで、rmarkdown::html_document(self_contained = FALSE)
出力時に、出力先と同じディレクトリツリー下にBootstrap関連のファイルをコピーする方法が知りたかった。
調べ方
経緯についてrmarkdown::html_document
のソースを見ると、extra_dependencies
を利用しているとすぐわかりました。
そこで引数の使い方を調べるべく、
?rmarkdown::html_document
を参照したところ、
rmarkdown::html_document_base
に引き渡すとあります。遡って参照するとExtra dependencies
との説明があります。これでは引数名以上の情報が一切得られません1。
しかたがないので、rmarkdown::html_document
のソースコードを見てみましょう。すると、extra_dependencies
引数は以下のような追加処理をうけた上で、
rmarkdown::html_document_base
のextra_dependencies
引数に渡されます。
extra_dependencies <- append(extra_dependencies,
list(html_dependency_jquery(),
html_dependency_jqueryui(),
html_dependency_tocify()))
extra_dependencies
にappend
しているlist
は以下の通り、
html_dependency
クラスオブジェクトの集まりです。
library(rmarkdown)
appended_dependencies <-
list(html_dependency_jquery(),
html_dependency_jqueryui(),
html_dependency_tocify())
str(lapply(appended_dependencies, class))
#> List of 3
#> $ : chr "html_dependency"
#> $ : chr "html_dependency"
#> $ : chr "html_dependency"
html_dependency
クラスオブジェクトの作り方を見るため
rmarkdown::html_dependency_jquery
のソースコードを覗いてみましょう。すると、htmltools::htmlDependency
を使えばいいとがわかります。
rmarkdown::html_dependency_jquery
#> function() {
#>
#> htmlDependency(
#> name = "jquery",
#> version = "1.11.3",
#> src = pkg_file("rmd/h/jquery"),
#> script = "jquery.min.js")
#> }
#> <bytecode: 0x5615ce6001c8>
#> <environment: namespace:rmarkdown>