rmarkdown::render() в цикле - не может выделить вектор размера
У меня есть несколько каталогов с файлами Rmd для компиляции в HTML. Каждый звонок rmarkdown::render
включает в себя большой список params
, Все отлично работает, когда я рендерим файлы Rmd по отдельности.
Однако, когда я выполняю функцию, которая зацикливается на каталогах и создает файлы HTML, происходит сбой после завершения девяти (это не конкретный Rmd, вызывающий проблему, он вылетает 9-го числа независимо от порядка).
Соответствующая часть трассировки ошибок:
Error: cannot allocate vector of size 38.4 Gb
8. knitr::knit_meta_add(old_knit_meta, attr(old_knit_meta, "knit_meta_id"))
7. rmarkdown::render(input = RMDfile, output_file = RMDfileout,
output_format = output, output_dir = dir, param = params,
quiet = quiet)
Кажется, проблема вызвана этой строкой в rmarkdown::render
:
on.exit({
knit_meta_reset()
if (length(old_knit_meta)) {
knitr::knit_meta_add(old_knit_meta, attr(old_knit_meta,
"knit_meta_id"))
}
}, add = TRUE)
Мне кажется, что params
от предыдущих вызовов сохраняются в метаданных и становятся слишком большими после rmarkdown::render
вызывается 9 раз в функции.
rmarkdown::knitr
имеет knit_meta
аргумент, но справочная документация гласит "(для экспертного использования) метаданные, сгенерированные knitr", и я не knitr
эксперт.
Файлы Rmd полностью независимы друг от друга. Есть ли способ сбросить метаданные knitr для каждого вызова rmarkdown::render
?
Я надеюсь, что кто-то может предложить быстрое решение или обходной путь для этого. Если нет, я разработаю пример, чтобы воспроизвести проблему.
1 ответ
Покопавшись в rmarkdown::render
Код на некоторое время я нашел решение.
Добавление knitr::knit_meta(class=NULL, clean = TRUE)
до rmarkdown::render(input=file, etc)
кажется, делает свое дело..