使用带有 knitr::kable 和 kableExtra::add_header_above 的 for 循环

Using a for loop with knitr::kable and kableExtra::add_header_above

我正在使用 R 版本 3.5.2

我想kable函数中计算一个字符串,但我遇到了一些问题。通常,我可以使用 get 函数通过 for 循环传递一个字符串,但在 kableExtra::add_header_above 函数中我得到以下错误:

Error: unexpected '=' in:"print(kable(df4,"html", col.names = c("zero","one")) %>% add_header_above(c(get("string") ="

我尝试了一些技术,例如在 kable 函数之外创建一个字符串并调用它,在 knit 循环中使用分页符和打印语句,以及尝试 eval 函数。我还按照建议

添加了结果 ="asis"

这是一个可重现的例子:

```{r  results="asis"}    
library("knitr")
    library("kableExtra")

    df1 <- mtcars %>% dplyr::select(am,vs)

    df1a <- df1 %>% mutate(type = "A")
    df1b <- df1 %>% mutate(type = "B")
    df1c <- df1 %>% mutate(type = "C")

    df2 <- rbind(df1a,df1b,df1c)

    vector <- as.vector(unique(df2$type))

    for (variable in vector) {

      df3 <- df2 %>% filter(type == (variable))

      df4 <- table(df3$am,df3$vs)

    print(kable(df4,"html", col.names = c("zero","one")) %>%
      add_header_above(c(get("string") = 3)))

    }
```

理想情况下,我希望 table 的 header 具有列 type 中的字符串名称。下面是我希望它看起来的示例:

print(kable(df4,"html", col.names = c("zero","one")) %>%
  add_header_above(c("A" = 3)))

我知道 knitr 函数在使用 解决方案中的循环时需要与常规 R 不同,但我仍在努力正确评估字符串。也许是因为该函数需要一个 vecotr 输入,它没有将其作为字符串求值?

您必须将 header 定义为矢量。 header 的名称应该是向量的名称,向量的值是 header 将使用的列数。 代码中的循环应如下所示:

for (variable in vector) {
  df3 <- df2 %>% filter(type == (variable))
  df4 <- table(df3$am,df3$vs)
  header_temp = 3
  names(header_temp) = get("variable")
  print(kable(df4,"html", col.names = c("zero","one")) %>%
    add_header_above(header_temp))
}

因此,首先我在变量 header_temp 中定义了 header 的列数,然后我为其分配了一个名称。