在Rmd中调用rmarkdown::render编织另一个Rmd时遇重复setup块错误
解决嵌套编织Rmd时的重复Chunk标签错误
我之前也遇到过完全一样的问题!当你在file1.Rmd里用rmarkdown::render()调用另一个Rmd文件时,knitr在编织主文档(file1)的过程中会全局跟踪所有chunk标签——哪怕你用了new.env(),标签注册表还是共享的。这就是为什么两个文件都有setup标签时,批量编织file1会报错,而交互式运行代码块时没问题(交互式环境不会持续维护全局标签列表)。
下面是三个靠谱的解决办法,你可以根据需求选:
办法1:让子文档的编织完全独立(推荐)
修改file1里的渲染代码,给rmarkdown::render()加上output_options参数,强制knitr为子文档创建独立的标签空间:
```{r knit-it} rmarkdown::render( "./file2.Rmd", envir = new.env(), output_options = list( knitr_options = list( opts_knit = list(global.parallel = TRUE) ) ) )
`global.parallel = TRUE`会告诉knitr不要共享主文档的chunk标签注册表,这样两个`setup`标签就不会冲突了,子文档的内容也完全不用改。 --- ### 办法2:直接重命名重复的chunk标签(最简单) 既然问题是标签重复,那直接改其中一个文件的chunk名字就行,比如把file2里的`setup`改成`setup-file2`: ```r ```{r setup-file2, include=FALSE} knitr::opts_chunk$set(echo = TRUE) knitr::opts_knit$set(root.dir = here::here())
这个办法零成本,不需要调整渲染逻辑,适合快速解决问题。 --- ### 办法3:用`knit_child()`嵌入子文档内容(如果需要合并输出) 如果你不想生成独立的file2输出,而是想把file2的内容直接插到file1的输出里,那就用`knitr::knit_child()`代替`rmarkdown::render()`: ```r ```{r knit-it, results='asis'} cat(knitr::knit_child("./file2.Rmd", envir = new.env(), quiet = TRUE))
knit_child会自动给子文档的chunk标签加上前缀,完全避免冲突,还能直接把子文档的内容嵌入主文档的HTML/PDF里。 --- ### 修改后的可复现示例(用办法1) #### file1.Rmd ```r --- title: "File 1" output: html_document --- ```{r setup, include=FALSE} knitr::opts_chunk$set(echo = TRUE) knitr::opts_knit$set(root.dir = here::here())
Let's knit it
rmarkdown::render( "./file2.Rmd", envir = new.env(), output_options = list( knitr_options = list( opts_knit = list(global.parallel = TRUE) ) ) )
#### file2.Rmd(保持原样不变) ```r --- title: "File 2" output: github_document --- ```{r setup, include=FALSE} knitr::opts_chunk$set(echo = TRUE) knitr::opts_knit$set(root.dir = here::here())
Knit me
rnorm(2)
内容的提问来源于stack exchange,提问作者Stefano
相关产品推荐
相关产品推荐

