メモ:Rのon.exitは関数の中じゃないと動かないっぽい

インデックスを生成するために、

  1. 一時的にindex.mdをつくる
  2. index.mdをknitしてHTMLを生成
  3. index.mdを削除

という処理をやりたくて、

md_tmp <- tempfile(tmpdir = ".", fileext = ".md")
on.exit(file.dremove(md_tmp))

cat("foo", file = md_tmp)
rmarkdown::render(md_tmp, output_file = "index.html")

みたいなスクリプトをRscriptで走らせればいいや、と思ってやってたら、この一時ファイルがまったく消えてくれなくて困った。正常終了でも異常終了でも消えない。

はじめはrender()がなにか変なことしてるのかなーと思ってたけど、どうも、R自体が終了するときはon.exit()は動かないっぽい。

こんな感じで関数で包んでやると動いた。

local({
   md_tmp <- tempfile(tmpdir = ".", fileext = ".md")
   on.exit(file.dremove(md_tmp))

   cat("foo", file = md_tmp)
   rmarkdown::render(md_tmp, output_file = "index.html")
})

rmarkdown-website-template/generateIndex.R at gh-pages · yutannihilation/rmarkdown-website-template · GitHub