use*_*531 9 r knitr r-markdown
给定子文档列表,您如何根据某些条件选择插入主文档?
在我的用例中,我将一个数据集中的未知条目与第二个数据集中的所需条目进行匹配.第二个数据集具有与每个条目相关联的子文档.如果找到匹配项,我想要包含其关联的子文档.
在其最基本的形式,这个伪代码显示了什么,我想实现(被这个问题启发要点这里):
```{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}
```
}
```
Run Code Online (Sandbox Code Playgroud)
或者,更简单:
```{r}
child_docs <- c("child/doc1.Rmd", "child/doc2.Rmd","child/doc3.Rmd","child/doc4.Rmd")
```
```{r child = child_docs}
```
Run Code Online (Sandbox Code Playgroud)
我也试过这些,但它们没有用(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)
}
```
Run Code Online (Sandbox Code Playgroud)
(直接在RMarkdown文档中):
`for(i in seq_along(child_doc)){ doc <- child_doc[i]; knit_child(doc)}`
Run Code Online (Sandbox Code Playgroud)
作为参考,这里的手册(在LaTeX中)就在这里.
use*_*531 13
自己找到解决方案; 只需将子文档向量传递给代码块.
```{r}
child_docs <- c("doc1.Rmd", "doc2.Rmd","doc3.Rmd","doc4.Rmd")
```
```{r, child = child_docs}
```
Run Code Online (Sandbox Code Playgroud)
实现我自己的代码后,以获取要包含的子文档列表.
您可以动态呈现子文档
```{r, result='asis'}
cat(knitr::knit_child("child.Rmd", quiet=TRUE))
```
Run Code Online (Sandbox Code Playgroud)
这为您提供了极大的灵活性。
“技巧”是result='asis'这样,然后将输出传递以进行转换(与“编织”相反)。
或者,您可以标记对象并避免块选项中的“asis”:
```{r}
cat(knitr::asis_output(knitr::knit_child("child.Rmd", quiet=TRUE)))
```
Run Code Online (Sandbox Code Playgroud)
这更健壮,因为它允许您在嵌套函数等中使用它,而不必依赖于设置“正确”块选项的调用者。
如果要传入“当前”变量和库,也可以传入当前环境:
```{r, result='asis'}
cat(knitr::knit_child("child.Rmd", quiet=TRUE, envir=environment()))
```
Run Code Online (Sandbox Code Playgroud)