我有一堆带有Rmd文件的目录,这些目录将被编译成HTML。每次对rmarkdown::render
的调用都包含一个很大的params
列表。当我分别渲染Rmd文件时,一切正常。
但是,当我执行一个遍历目录并构建HTML文件的函数时,在完成9个函数后它就会崩溃(这不是导致问题的特定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文件彼此完全独立。有没有一种方法可以为每个对
rmarkdown::render
的调用重置knitr元数据?我希望有人可以为此提供快速修复或解决方法。如果没有,我将举一个例子来重现该问题。
最佳答案
在研究rmarkdown::render
代码一段时间后,我找到了解决方案。
在knitr::knit_meta(class=NULL, clean = TRUE)
之前添加rmarkdown::render(input=file, etc)
似乎可以解决问题。
关于循环中的rmarkdown::render()-无法分配大小的向量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49887792/