【问题标题】:how to use a for loop in rmarkdown?如何在 rmarkdown 中使用 for 循环?
【发布时间】:2018-12-14 09:53:05
【问题描述】:

考虑这个简单的例子:

---
title: "Untitled"
output: ioslides_presentation
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = FALSE)
```
## Slide with R Output
```{r t,  warning=FALSE, message=FALSE}

library(knitr)
library(kableExtra)
library(dplyr)

for(threshold in c(20, 25)) {
  cars %>% 
    filter(dist < threshold) %>%
    kable('html') %>% 
    kable_styling(bootstrap_options = "striped") 
}
```

在这里,我只想将for loop 的每个输出打印到不同的幻灯片中。在此示例中,有两个对 kable 的调用应该在两张不同的幻灯片上进行。

上面的代码不起作用。我什至为此使用了正确的软件包吗?有什么想法吗?

谢谢!

【问题讨论】:

    标签: r r-markdown kable kableextra


    【解决方案1】:

    您可以使用asis 选项:

    ---
    title: "Untitled"
    output: ioslides_presentation
    ---
    
    ```{r setup, include=FALSE}
    knitr::opts_chunk$set(echo = FALSE)
    library(knitr)
    library(kableExtra)
    library(dplyr)
    # needed so r will include javascript/css dependencies needed for striped tables:
    kable(cars, "html") %>% kable_styling(bootstrap_options = "striped")
    ```
    
    ```{r, results = "asis"}
    for (threshold in c(20, 25)) {
      cat("\n\n##\n\n")
      x <- cars %>%
        filter(dist < threshold) %>%
        kable('html') %>%
        kable_styling(bootstrap_options = "striped")
      cat(x)
    }
    ```
    

    【讨论】:

    • 是的,显然 rmarkdown 不会在 html 文件中包含依赖项,除非它认为它需要...因为块的输出是原始文本,rmarkdown 没有考虑寻找所需的依赖项包含在文件中,因此不包含渲染剥离表所需的任何内容。我已经编辑了答案,以便包含一个虚拟表,这将导致 rmarkdown 包含所需的文件。
    • 显然cars 数据框只有两列(View(cars))...也许您想在示例中使用mtcars 而不是cars?我看到我自己在答案中混合并匹配了数据集。我已经编辑了我的答案,所以它只引用了cars 数据集。
    【解决方案2】:

    这是解决方案的开始。您可以通过自己制作字符串或使用panderpandoc.* 函数来打印带有markdown 的字符串。如果您为该块设置results="asis",它将与任何其他降价一样编译。我使用cat 制作## 标题,但注释掉了两个pander 函数,您也可以尝试制作标题或水平规则来分割幻灯片。

    有更多关于 pander 函数 here 的详细信息,以及其他 SO 问题,例如 this one

    ---
    title: "Untitled"
    output: ioslides_presentation
    ---
    
    ```{r setup, include=FALSE}
    knitr::opts_chunk$set(echo = FALSE)
    
    library(knitr)
    library(kableExtra)
    library(dplyr)
    
    ```
    
    
    ```{r, results='asis'}
    for(threshold in c(20, 25)) {
      # pander::pandoc.header(sprintf("Threshold = %s", threshold))
      # pander::pandoc.horizontal.rule()
      cat(paste("\n##", "Threshold =", threshold), "\n")
    
      tbl <- cars %>% 
        filter(dist < threshold) %>%
        kable(format = "html") %>%
        kable_styling(bootstrap_options = "striped")
      print(tbl)
    }
    ```
    

    一个问题是,当我编织这个时,我没有得到你所期望的条纹表。如果我在这个块之前添加一张幻灯片并在其中放置一个带有这些 kableExtra 设置的表格,我确实会得到条纹,但第一个表格也很丑......我不确定是否那是某个地方的错误或冲突的 CSS 或什么。

    【讨论】:

    • 感谢 camille,但问题是我想保留 kableextras 的格式化魔法
    • 特别是条纹:)
    • 我不确定这到底是怎么回事——每次我弄乱它时都会得到不同的结果,没有一个是好的。我认为现在的问题不是从循环中生成表格,而是让kableExtraioslides 以及它们的CSS 以你想要的方式共存。我发现了一些与此相关的 SO 帖子和 github 问题
    【解决方案3】:

    要摆脱那个假表,您可以尝试将options(kableExtra.html.bsTable = T) 放入您的设置部分。

    【讨论】:

    • 这是最好的解决方案
    猜你喜欢
    • 2020-06-26
    • 2018-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-06
    • 2014-11-01
    • 2017-05-24
    • 2012-10-08
    相关资源
    最近更新 更多