在另一个文档中包含一个特定的Markdown文档块

10

我想将一个Markdown文档中特定代码块的代码包含在第二个Markdown文档中。我希望通过引用代码块的名称来实现此操作(请勿使用行号的hacky引用)。我不想在子文档中运行所有代码,因为其中一些代码非常耗时。

我尝试了以下方法:read_chunk可以包含Markdown文档中的纯R脚本;虽然有run_chunk,但不清楚是否可与外部文档一起使用(到目前为止没有成功)。

我们可以 这样做 来获取另一个完整的Markdown文档以在其中运行:

```{r child='first.Rmd'}
```

但是我该如何将子文档中的一个特定块插入到另一个文档中?以下是一个小例子:

这是test-main.Rmd

```{r pick-up-the-kid, child='test-child.Rmd'}
```

这是test-child.Rmd文件

Hi, there. I'm a child.

```{r test-child-1}
1+1
dnorm(0)
```

```{r test-child-2}
2+2
dnorm(0)
```

当我们运行 test-main.Rmd 时,会得到以下结果:

Hi, there. I’m a child.

1+1
## [1] 2
dnorm(0)
## [1] 0.3989
2+2
## [1] 4
dnorm(0)
## [1] 0.3989

有一个方法几乎可以做到这一点,那就是ref.label。如果我们这样编辑test-main.Rmd

```{r pick-up-the-kid, child='test-child.Rmd', ref.label='test-child-2'}
```

输出了所需的块,但是它是重复的,这样不好:

Hi, there. I’m a child.

2+2
## [1] 4
dnorm(0)
## [1] 0.3989
2+2
## [1] 4
dnorm(0)
## [1] 0.3989

处理重复的一种解决方案是在子文档的代码块选项中使用 eval = FALSE, echo = FALSE

```{r test-child-2, eval = FALSE, echo = FALSE}
2+2
dnorm(0)
```

从而获得所需的结果:

2+2
## [1] 4
dnorm(0)

但是,在子文档中更改该块不太方便,因为其他块需要该块,并且我不想每次运行主文档时更改子文档中的少数几个块,这对可重复性不利。

如何通过引用块名称(而无需重复或调整块选项)从test-child.Rmd 中仅获取 test-child-2 块到 test-main.Rmd 中?

我正在寻找一个名为child_chunk的函数,它可以在主文档中给出子文档名称和块名称,并应用独立于子文档中块选项的块选项。

或者,唯一的解决方案是将代码移动到 R 脚本文件中并在两个 markdown 文档之间共享吗?


关于这个,我创建了一个名为source_rmd_chunks()的函数,它可以根据代码块标签名称从RMD文件中获取代码块。链接:https://gist.github.com/brshallo/e963b9dca5e4e1ab12ec6348b135362e - Bryan Shalloway
2个回答

6

我建议您尝试使用 purl 命令提取原始子文档中的代码块,并从生成的代码文件中读取该部分内容,然后可以随后将其删除。

这是 test-main.Rmd 文件。

```{r echo=FALSE}
invisible(purl("test-child.Rmd", output="temp", quiet=TRUE))
read_chunk("temp")
```

```{r ref.label='test_child_2'}
```

```{r echo=FALSE}
unlink("temp")
```

我修改了你的test-child.Rmd文件,因为你的标签在我的电脑上无法工作:

你好,我是子文件。

```{r test_child_1}
1+1
dnorm(0)
```

```{r test_child_2}
2+2
dnorm(0)
```
< p >< code >knit('test-main.Rmd') 的输出结果如下:

```r
2+2
```


```
## [1] 4
```

```r
dnorm(0)
```

```
## [1] 0.3989
```

0

在2021年,你可以使用

```{r, include=F, cache=F}
knitr::read_chunk("my_file.Rmd")
```

```{r my_reusable_chunk}```
```

在文件myfile.Rmd中,感兴趣的代码块包含以## ----为前缀的行:

## ---- my_reusable_chunk

来源: https://bookdown.org/yihui/rmarkdown-cookbook/read-chunk.html

这并不完全符合原始问题的要求,因为需要使用代码块名称,但它并不需要太多的努力(只需包含魔术注释)。

(我发现调试包含的代码块很困难...)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接