循环中的rmarkdown :: render() - 无法分配大小为

时间:2018-04-17 21:30:03

标签: r r-markdown knitr

我有一堆目录,其中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文件完全相互独立。有没有办法为每次调用rmarkdown::render重置knitr元数据?

我希望有人能为此提供快速修复或解决方法。如果没有,我将开发一个例子来重现这个问题。

1 个答案:

答案 0 :(得分:11)

rmarkdown::render代码中挖掘了一段时间后,我找到了解决方案。

knitr::knit_meta(class=NULL, clean = TRUE)之前添加rmarkdown::render(input=file, etc)似乎可以解决问题..