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

Ben*_*Ben 7 markdown r knitr

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

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

我们可以做让整个降价文档里面的另一个运行:

```{r child='first.Rmd'}
```
Run Code Online (Sandbox Code Playgroud)

但是,如何才能将子文档中的一个特定块添加到另一个文档中?这是一个小例子:

这是 test-main.Rmd

```{r pick-up-the-kid, child='test-child.Rmd'}
```
Run Code Online (Sandbox Code Playgroud)

这是 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)
```
Run Code Online (Sandbox Code Playgroud)

当我们跑步时,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
Run Code Online (Sandbox Code Playgroud)

几乎可以做到的一种方法是ref.label.如果我们这样编辑test-main.Rmd:

```{r pick-up-the-kid, child='test-child.Rmd', ref.label='test-child-2'}
```
Run Code Online (Sandbox Code Playgroud)

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

Hi, there. I’m a child.

2+2
## [1] 4
dnorm(0)
## [1] 0.3989
2+2
## [1] 4
dnorm(0)
## [1] 0.3989
Run Code Online (Sandbox Code Playgroud)

复制的一个解决方案eval = FALSE, echo = FALSE在子文档中的块选项中使用:

```{r test-child-2, eval = FALSE, echo = FALSE}
2+2
dnorm(0)
```
Run Code Online (Sandbox Code Playgroud)

这给出了期望的结果:

2+2
## [1] 4
dnorm(0)
Run Code Online (Sandbox Code Playgroud)

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

如何才能得到只有大块test-child-2test-child.Rmdtest-main.Rmd参照块名称(无重复或块选项摆弄)?

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

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

Tho*_*mas 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")
```
Run Code Online (Sandbox Code Playgroud)

我修改你test-child.Rmd的使用不同的标签,因为你的我的机器没有工作:

嗨,您好.我还是个孩子.

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

```{r test_child_2}
2+2
dnorm(0)
```
Run Code Online (Sandbox Code Playgroud)

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

```r
2+2
```


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

```r
dnorm(0)
```

```
## [1] 0.3989
```
Run Code Online (Sandbox Code Playgroud)