我想将一个降价文档的特定块中的代码包含到第二个降价文档中。我希望通过按名称引用块来实现(请{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-2
从test-child.Rmd
转换为test-main.Rmd
(并且没有重复或摆弄块选项)?
我正在寻找一个可以被称为child_chunk
的函数,我可以在其中给出子文档名称和块名称,并在主文档中将块选项应用于独立于块中的块选项。孩子的医生。
或者是将代码移入R
脚本文件并在两个降价文档之间共享的唯一解决方案吗?
答案 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
这不太符合原始问题的要求,即应该使用块名称,但不需要太多努力(只需包含魔术注释即可)。
(我发现很难调试包含的块...)