17.5 Knit ボタンをカスタマイズする (*)

RStudio の Knit ボタンをクリックすると, 新規の R セッション内で rmarkdown::render() が呼び出され, 同じディレクトリに入力ファイルと同じ基底名の出力ファイルが出力されます. 例えば出力フォーマット html_documentexample.Rmd を knit すると, example.html というファイルが作られます.

文書がどうレンダリングされるかをカスタマイズしたいという状況もあるでしょう. 例えば今日の日付を文書に含めたり, コンパイルした文書を別のディレクトリに出力したいというときです. このようなことは適切な output_file 引数を付けて rmarkdown::render() を呼び出すことで実現できるのですが (17.3節参照) , レポートをコンパイルするのに rmarkdown::render() をいちいち呼び出すことに頼るのは不便かもしれません.

文書の YAML フロントマターで knit フィールドを与えれば Knit ボタンの挙動を制御できます. このフィールドは, 主要な引数 input( 入力 Rmd 文書のパス)を伴って関数を取ってくれますが, 現時点では他の引数は無視されます. 関数のソースコードを直接 knit コードに書くことも, R パッケージなどどこか別の場所に関数を置いてそれを呼び出すことも可能です. カスタム knit 関数が日常的に必要ならば, 毎度のように R Markdown 文書に関数のソースコードを繰り返し書くのではなく, パッケージに関数を置くことをお薦めします.

YAML に直接ソースコードを置くなら, 関数全体をパーレン () で囲まなければなりません. ソースコードが複数行になるなら, 最初の行以外の全ての行にスペース2つ分のインデントをしなければなりません. 例えば出力ファイル名にレンダリングした日付を含めたい場合, 次のような YAML コードが使用可能です.

---
knit: (function(input, ...) {
    rmarkdown::render(
      input,
      output_file = paste0(
        xfun::sans_ext(input), '-', Sys.Date(), '.html'
      ),
      envir = globalenv()
    )
  })
---

例えば 2019/07/29 に example.Rmd を knit したなら, 出力ファイル名は example-2019-07-29.html となります.

上記のアプローチは単純で直截的ですが, 関数が R Markdown 文書で使われるのが1度限りでないと, YAML に直接関数を埋め込むのは管理が難しくなります. そこで例えばパッケージ内に knit_with_date() という関数を作成するとよいでしょう.

#' RStudio 用のカスタム knit 関数
#'
#' @export
knit_with_date <- function(input, ...) {
  rmarkdown::render(
    input,
    output_file = paste0(
        xfun::sans_ext(input), '-', Sys.Date(), '.',
        xfun::file_ext(input)
    ),
    envir = globalenv()
  )
}

上記のコードを myPackage という名前のパッケージに追加すれば, 次のような YAML 設定を使いカスタム knit 関数を参照することが可能になります.

---
knit: myPackage::knit_with_date
---

?rmarkdown::render のヘルプページを見て, Knit ボタンの背後にある knit 関数のカスタマイズについて, さらなるアイディアを見つけるのもよいでしょう.