对knitr :: kable和kableExtra :: add_header_above

时间:2019-02-25 23:17:04

标签: r kable kableextra

我正在使用 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循环中使用分页符和print语句,还尝试了eval函数。我还根据建议here

添加了结果=“ 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)))

    }
```

理想情况下,我希望表的标题具有来自type列的字符串名称。以下是我希望它看起来的示例:

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

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

1 个答案:

答案 0 :(得分:1)

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

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中定义标题的列数,然后为其分配名称。