有条件地在RMarkdown中使用knitr列出子文档列表

时间:2016-09-07 19:11:05

标签: r knitr r-markdown

鉴于子文档列表,您如何根据某些条件选择插入主文档?

在我的用例中,我将一个数据集中的未知条目与第二个数据集中的所需条目进行匹配。第二个数据集具有与每个条目相关联的子文档。如果找到匹配项,我想要包含其关联的子文档。

在最基本的形式中,这个伪代码显示了我想要实现的目标(受此问题的启发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

2 个答案:

答案 0 :(得分:12)

自己找到解决方案;只需将子文档向量传递给代码块。

```{r}
child_docs <- c("doc1.Rmd", "doc2.Rmd","doc3.Rmd","doc4.Rmd")
```

```{r, child = child_docs}
```

在实现我自己的代码之后,获取要包含的子文档列表。

答案 1 :(得分:4)

您可以动态呈现子文档

```{r, result='asis'}
cat(knitr::knit_child("child.Rmd", quiet=TRUE))
```

为您提供极大的灵活性。

“技巧”是result='asis',因此输出将继续进行转换(与“编织”相对)。

或者,您可以标记对象并避免在块选项中出现“麻烦”:

```{r}
cat(knitr::asis_output(knitr::knit_child("child.Rmd", quiet=TRUE)))
```

这更加健壮,因为它允许您在嵌套函数等中使用它,而不必依赖设置了“正确”块选项的调用方。

如果您要传入“当前”变量和库,也要传入当前环境:

```{r, result='asis'}
cat(knitr::knit_child("child.Rmd", quiet=TRUE, envir=environment()))
```