【问题标题】:Conditionally include a list of child documents in RMarkdown with knitr使用 knitr 有条件地在 RMarkdown 中包含子文档列表
【发布时间】:2016-09-07 19:11:05
【问题描述】:

给定一个子文档列表,如何根据某些标准选择将哪个子文档插入主文档?

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

以最基本的形式,这个伪代码显示了我想要实现的目标的要点(受这个问题 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 knitr r-markdown


    【解决方案1】:

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

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

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

    【讨论】:

    • 您好,出于好奇,如果您在 doc1.Rmd 加载所需的所有库,如您的示例所示,您是否需要在所有其他库中再次加载库?
    • @MasonBeau 我不这么认为,但是我不建议采用这种方法。如果你要这样做,你应该将它们加载到父文档中,例如正在加载 doc1.Rmd 等的 Rmd。如果你这样做,你应该小心,因为如果子文档正在调用它们没有加载的函数和库,它会使你的代码更加混乱。如果您想要一个更加模块化和一致的代码库,您仍然应该在每个子文档中调用您打算使用的每个库。
    • 这似乎是更简单的路线,但我认为它太多余了,并且可能存在更聪明的方法来做到这一点。很高兴知道我这么离谱。泰。
    • @MasonBeau 我想你会对这里的这个问题感兴趣,它在编织子文档时解决了 R 环境中的这些问题; stackoverflow.com/questions/34498734/…
    【解决方案2】:

    您可以动态呈现子文档

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

    这为您提供了极大的灵活性。

    “诀窍”是result='asis',这样输出就会被传递以进行转换(与“编织”相反)。

    或者,您可以标记对象并避免块选项中的“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()))
    ```
    

    【讨论】:

      猜你喜欢
      • 2021-08-20
      • 2017-09-30
      • 1970-01-01
      • 2014-09-05
      • 1970-01-01
      • 2016-01-01
      • 1970-01-01
      • 2013-10-05
      • 1970-01-01
      相关资源
      最近更新 更多