如何在Rmd父文档中调用子文档代码块且避免重复输出?
解决Rmd父文档调用子文档指定代码块重复输出的问题
问题根源
你当前的写法会在每次调用child='force.Rmd'时完整执行整个子文档的所有代码块,再通过ref.label筛选显示指定输出,而非只执行目标代码块。两次调用就会重复执行所有子文档代码,导致重复输出。
解决方案
方案1:通过代码块读入+标签引用(推荐)
这种方式更符合knitr的代码块管理逻辑,避免重复执行子文档全部内容:
- 修改父文档
figures.Rmd
在开头的setup代码块中读入子文档的代码块,并设置允许重复标签(如果需要):
{r setup, include=FALSE} knitr::read_chunk("force.Rmd") options(knitr.duplicate.label = 'allow') # 全局设置一次即可,无需在子文档重复写
之后直接通过ref.label引用目标代码块,无需child参数:
{r, ref.label='pressure', echo=F}
some text
{r, ref.label='cars', echo=F}
- 调整子文档
force.Rmd
给所有代码块添加eval=FALSE,默认不执行(避免被误执行):
{r, cars, echo=F, eval=FALSE} plot(cars)
{r, pressure, echo=F, eval=FALSE} summary(pressure)
方案2:直接提取并执行指定代码块
无需修改子文档,通过knitr::extract_chunk()精准提取目标代码块执行:
在父文档的对应位置使用以下代码:
{r pressure, echo=F} # 提取子文档中标签为pressure的代码块并执行 knitr::extract_chunk("force.Rmd", "pressure") |> knitr::knit(text = _)
some text
{r cars, echo=F} # 提取子文档中标签为cars的代码块并执行 knitr::extract_chunk("force.Rmd", "cars") |> knitr::knit(text = _)
内容的提问来源于stack exchange,提问作者شاه نواز
相关产品推荐
相关产品推荐

