【问题标题】:Why does datatable not print when looping in rmarkdown?为什么在rmarkdown中循环时不打印数据表?
【发布时间】:2017-02-05 13:14:24
【问题描述】:

我正在创建一个动态 rmarkdown 文档。最终结果应该为数据中的每个“分类”创建一个选项卡。每个选项卡都应该有一个来自 DT 包的数据表,其中打印了数据。以下是我一直在使用的代码:

---
output: html_document
---

# Setup{.tabset}
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = FALSE)
library(knitr)
library(DT)
```

```{r data.setup}
set.seed = 1242
rows = 64
data.1 = runif(rows, 25, 75)
data.2 = runif(rows, .01, 1)
data.3 = runif(rows, 1, 10)
classification = c("A", "B", "C", "D")
df = data.frame(cbind(data.1 = data.1, data.2 = data.2, data.3 = data.3, classification = classification))
df$data.1 = as.numeric(df$data.1)
df$data.2 = as.numeric(df$data.2)
df$data.3 = as.numeric(df$data.3)
```

```{r results= 'asis'}
for(j in levels(df$classification)){
        df.j = df[df$classification == j, ]
        cat(paste("\n\n## Classification: ", j, "##\n"))
        w = datatable(df.j)
        #datatable(df.j)
        print(w)
}
```

请注意,我已经注释掉了对数据表函数的直接调用,这些调用没有打印到 rmarkdown。所写的调用结果会生成一个带有正确选项卡的 html 文档,但其中没有数据表。此外,数据表实际上显示在我的 RStudio 会话中,并带有正确的子集。作为测试,我尝试使用 knitr 的 kable 函数来实现目标,并且表格打印在相应的选项卡中,不幸的是,kable 没有所需的所有功能。

【问题讨论】:

    标签: r loops r-markdown yui-datatable


    【解决方案1】:

    通过谷歌搜索相同的问题到达这里。这对我有用:https://gist.github.com/ReportMort/9ccb544a337fd1778179

    基本上,生成一个渲染的小标题列表并手动调用knit

    这是一个基于您的示例的工作 Rmd,使用上面链接中的技术:

    ---
    output: html_document
    ---
    
    # Setup{.tabset}
    ```{r setup, include=FALSE}
    knitr::opts_chunk$set(echo = FALSE)
    library(knitr)
    library(DT)
    ```
    
    ```{r data.setup}
    set.seed <- 1242
    rows <- 64
    data.1 <- runif(rows, 25, 75)
    data.2 <- runif(rows, .01, 1)
    data.3 <- runif(rows, 1, 10)
    classification <- c("A", "B", "C", "D")
    df <- data.frame(cbind(data.1 = data.1, data.2 = data.2, data.3 = data.3, classification = classification))
    df$data.1 <- as.numeric(df$data.1)
    df$data.2 <- as.numeric(df$data.2)
    df$data.3 <- as.numeric(df$data.3)
    ```
    
    ```{r include = FALSE}
    # prepare a list of 4 sub-dataframes, each corresponding to one classification
    df_list <- split(df, df$classification)
    ```
    
    ```{r create-markdown-chunks-dynamically, include=FALSE}
    
    out = NULL
    for (c in names(df_list)) {
      knit_expanded <- paste0("\n\n## Classification: ", c, "##\n\n```{r results='asis', echo=FALSE}\n\ndatatable(df_list[['", c, "']])\n\n```")
      out = c(out, knit_expanded)
    }
    
    ```
    
    <!--- knit those table chunk statements --> 
    `r paste(knit(text = out), collapse = '\n')`
    

    【讨论】:

    • 为了避免重复的块错误,我不得不添加代码来自动命名新的块。所以 knit_expanded 行变成了: knit_expanded {r ", c, ", results='asis', echo=FALSE}\n\nDT::datatable(df_list[['", c, "']])\n\n")
    【解决方案2】:

    这不是一个完整的答案,因为其中一些仍然让我感到困惑,但至少这足以让你在我尝试理解更多内容时继续前进。

    ---
    output: html_document
    ---
    
    # Setup{.tabset}
    ```{r setup, include=FALSE}
    knitr::opts_chunk$set(echo = FALSE)
    library(knitr)
    library(DT)
    ```
    
    ```{r data.setup}
    set.seed <- 1242
    rows <- 64
    data.1 <- runif(rows, 25, 75)
    data.2 <- runif(rows, .01, 1)
    data.3 <- runif(rows, 1, 10)
    classification <- c("A", "B", "C", "D")
    df <- data.frame(cbind(data.1 = data.1, data.2 = data.2, data.3 = data.3, classification = classification))
    df$data.1 <- as.numeric(df$data.1)
    df$data.2 <- as.numeric(df$data.2)
    df$data.3 <- as.numeric(df$data.3)
    ```
    
    ```{r include = FALSE}
    # Why, oh why do I need this chunk?
    datatable(df)
    ```
    
    ```{r results = 'asis'}
    for(j in unique(df$classification)){ # You were using level() here, so your for-loop never got off the ground
            df.j <- df[df$classification == j, ]
            cat(paste("\n\n## Classification: ", j, "##\n"))
            print( htmltools::tagList(datatable(df.j)) )
    }
    

    这需要第三个块才能工作,我还不知道为什么。

    【讨论】:

    • +1 我一直在寻找一个简单的解决方案,就是这样。请注意,在第三个块中,您可以输入datatable(df[1,]),它仍然可以工作!我想知道@yihui 是否知道为什么这是必要的
    • 我想我知道为什么需要第一次调用:这是为了确保包含/嵌入 DT 所需的 javascript 才能工作(仅包含标签时情况并非如此/完成)。你可以打电话给datatable(NULL)(为我工作)
    • for 循环中的第三个块仅在我的下一个块有要打印的数据表时才对我有用。否则它显示空白。可能是什么问题?
    • 也为我工作,非常感谢。还看到它需要第三块才能工作,很奇怪?这个解决方案似乎也适用于我,没有第三块的奇怪要求:github.com/rstudio/DT/issues/67#issuecomment-426329442
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    • 2020-05-28
    • 2016-02-11
    • 2021-08-22
    • 2019-12-23
    相关资源
    最近更新 更多