我有一堆带有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/

10-12 17:54