使用“ \ n”将文本包装在knitr :: kable表单元格中

时间:2018-10-23 08:30:44

标签: r r-markdown knitr kable

如何使用knitr::kable将单元格包装在\n表单元格中?


我想生成一个.rmd文件,其中包含一些表,其中一列需要换行。包装应发生的位置用\n标记。我尝试过(这是一个独立的.rmd文件):

---
output: pdf_document
---

## A Table with text wrap

```{r cars}
knitr::kable(data.frame(col1 = c("a", "b"), col2 = c("one\ntwo", "three\nfour")))
```

..但这不起作用。包裹的部分不停留在col2上,而是停留在col1的下一行上。

enter image description here

预期输出为:

col1 | col2
-------------
a    | one
     | two
b    | three
     | four

欢迎使用除knitr以外的其他程序包的解决方案,只要它们允许(几乎)打印为好。

2 个答案:

答案 0 :(得分:3)

一劳永逸的解决方案,用于标准表的灵活双HTML / PDF。它结合了@snoram概述的kableExtra的换行功能。
假设:您将<br>用作换行指示器。

```{r}
knit_table(df1)
```

image

代码

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

knit_table <- function(df){
  if (is_html_output()) {
    df %>%
      kable("html", escape = F) %>%
      kable_styling()
  } else {
    df <- data.frame(lapply(df, function(x) {gsub("<br>", "\n", x)}), stringsAsFactors = F)

    df %>%  
      mutate_all(linebreak) %>%
      kable("latex", booktabs = T, escape = F)  
  }
}

数据

df1 <- data.frame(col1 = c("a", "b"),
                  col2 = c("one<br>two", "three<br>four"))

答案 1 :(得分:3)

如果您不介意使用kableExtra,那么一定可以实现,这是一个示例:

library(kableExtra)
knitr::kable(data.frame(col1 = c("a", "b"), col2 = linebreak(c("one\ntwo", "three\nfour"))),
             escape = FALSE)

enter image description here

更多详细信息here