使用 "\n" 在 knitr::kable table 单元格中换行

wrap text in knitr::kable table cell using "\n"

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


我想生成一个包含一些 table 的 .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.

的下一行

预期输出为:

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

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

一种即发即弃的解决方案,用于灵活的双HTML/PDF 标准表。它结合了 @snoram 概述的 kableExtra 的换行功能。
假设:您使用 <br> 作为换行符。

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

代码

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"))

如果你不介意使用 kableExtra 你绝对可以做到这一点,这里有一个例子:

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

更多详情here