使用 knitr 在 RMarkdown 中有条件地包含子文档列表
Conditionally include a list of child documents in RMarkdown with knitr
给定子文档列表,您如何根据某些条件选择将哪个子文档插入到主文档中?
在我的用例中,我将一个数据集中的未知条目与第二个数据集中的所需条目进行匹配。第二个数据集具有与每个条目关联的子文档。如果找到匹配项,我想包括其关联的子文档。
这个伪代码以其最基本的形式展示了我想要实现的目标的要点(受此问题 here 启发):
```{r, eval=TRUE}
child_docs <- setNames(c(TRUE, FALSE, TRUE, FALSE),
c("doc1.Rmd", "doc2.Rmd","doc3.Rmd","doc4.Rmd"))
for(i in seq_along(child_docs)){
file <- names(child_docs)[i]
eval_status <- child_docs[i]
```{r child = file, eval = eval_status}
```
}
```
或者,更简单地说:
```{r}
child_docs <- c("child/doc1.Rmd", "child/doc2.Rmd","child/doc3.Rmd","child/doc4.Rmd")
```
```{r child = child_docs}
```
我也试过这些,但是没用
(RMarkdown 代码块):
```{r}
child_docs <- c("child/doc1.Rmd", "child/doc2.Rmd","child/doc3.Rmd","child/doc4.Rmd")
for(i in seq_along(child_docs)){
doc <- child_docs[i]
knit_child(doc)
}
```
(直接在 RMarkdown 文档中):
`for(i in seq_along(child_doc)){ doc <- child_doc[i]; knit_child(doc)}`
作为参考,执行此操作的手册(在 LaTeX 中)是 here。
自己找到解决方案;只需将子文档的向量传递给代码块。
```{r}
child_docs <- c("doc1.Rmd", "doc2.Rmd","doc3.Rmd","doc4.Rmd")
```
```{r, child = child_docs}
```
在实现我自己的代码以获取要包含的子文档列表之后。
您可以动态呈现子文档
```{r, result='asis'}
cat(knitr::knit_child("child.Rmd", quiet=TRUE))
```
这给了你很大的灵活性。
"trick" 是 result='asis'
,因此输出会被传递以进行转换(与 "knitting" 相反)。
或者,您可以标记对象并避免块选项中的 "asis":
```{r}
cat(knitr::asis_output(knitr::knit_child("child.Rmd", quiet=TRUE)))
```
这更健壮,因为它允许您在嵌套函数等中使用它,而不必依赖调用者设置 "correct" 块选项。
如果要传入"current"个变量和库,也传入当前环境:
```{r, result='asis'}
cat(knitr::knit_child("child.Rmd", quiet=TRUE, envir=environment()))
```
给定子文档列表,您如何根据某些条件选择将哪个子文档插入到主文档中?
在我的用例中,我将一个数据集中的未知条目与第二个数据集中的所需条目进行匹配。第二个数据集具有与每个条目关联的子文档。如果找到匹配项,我想包括其关联的子文档。
这个伪代码以其最基本的形式展示了我想要实现的目标的要点(受此问题 here 启发):
```{r, eval=TRUE}
child_docs <- setNames(c(TRUE, FALSE, TRUE, FALSE),
c("doc1.Rmd", "doc2.Rmd","doc3.Rmd","doc4.Rmd"))
for(i in seq_along(child_docs)){
file <- names(child_docs)[i]
eval_status <- child_docs[i]
```{r child = file, eval = eval_status}
```
}
```
或者,更简单地说:
```{r}
child_docs <- c("child/doc1.Rmd", "child/doc2.Rmd","child/doc3.Rmd","child/doc4.Rmd")
```
```{r child = child_docs}
```
我也试过这些,但是没用 (RMarkdown 代码块):
```{r}
child_docs <- c("child/doc1.Rmd", "child/doc2.Rmd","child/doc3.Rmd","child/doc4.Rmd")
for(i in seq_along(child_docs)){
doc <- child_docs[i]
knit_child(doc)
}
```
(直接在 RMarkdown 文档中):
`for(i in seq_along(child_doc)){ doc <- child_doc[i]; knit_child(doc)}`
作为参考,执行此操作的手册(在 LaTeX 中)是 here。
自己找到解决方案;只需将子文档的向量传递给代码块。
```{r}
child_docs <- c("doc1.Rmd", "doc2.Rmd","doc3.Rmd","doc4.Rmd")
```
```{r, child = child_docs}
```
在实现我自己的代码以获取要包含的子文档列表之后。
您可以动态呈现子文档
```{r, result='asis'}
cat(knitr::knit_child("child.Rmd", quiet=TRUE))
```
这给了你很大的灵活性。
"trick" 是 result='asis'
,因此输出会被传递以进行转换(与 "knitting" 相反)。
或者,您可以标记对象并避免块选项中的 "asis":
```{r}
cat(knitr::asis_output(knitr::knit_child("child.Rmd", quiet=TRUE)))
```
这更健壮,因为它允许您在嵌套函数等中使用它,而不必依赖调用者设置 "correct" 块选项。
如果要传入"current"个变量和库,也传入当前环境:
```{r, result='asis'}
cat(knitr::knit_child("child.Rmd", quiet=TRUE, envir=environment()))
```