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

时间:2014-06-28 11:00:24

标签: r markdown knitr

我想将一个降价文档的特定块中的代码包含到第二个降价文档中。我希望通过按名称引用块来实现(请{no hacky references to line-numbers)。我不想在孩子中运行所有代码,因为其中一些代码非常耗时。

这是我尝试过的。我们有read_chunk在markdown文档中包含普通R脚本。有run_chunk但不清楚这是否可以与外部文档一起使用(到目前为止我还没有运气)。

我们可以this让整个降价文档在另一个文档中运行:

```{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

复制的一个solution是在子文档的块选项中使用eval = FALSE, echo = FALSE

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

给出了期望的结果:

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

但是改变子文档中的块是不方便的,因为子文档中的其他块需要该块,并且我不想每次都在子文档中使用几个块进行更改我运行主要文档,它对重现性不好。

如何通过引用块名称将 {/ 1>} test-child-2test-child.Rmd转换为test-main.Rmd(并且没有重复或摆弄块选项)?

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

或者是将代码移入R脚本文件并在两个降价文档之间共享的唯一解决方案吗?

2 个答案:

答案 0 :(得分:5)

我会尝试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)
```

knit('test-main.Rmd')的输出因此是:

```r
2+2
```


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

```r
dnorm(0)
```

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

答案 1 :(得分: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

这不太符合原始问题的要求,即应该使用块名称,但不需要太多努力(只需包含魔术注释即可)。

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