【问题标题】:wrap text in knitr::kable table cell using "\n"使用 "\n" 在 knitr::kable 表格单元格中换行
【发布时间】:2019-03-27 10:12:06
【问题描述】:

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


我想生成一个 .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 之外的其他软件包的解决方案,只要它们允许(几乎)打印得一样好。

【问题讨论】:

    标签: r r-markdown knitr kable


    【解决方案1】:

    一劳永逸的解决方案,用于标准表格的灵活双 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"))
    

    【讨论】:

    • 感谢@Roman 提供了这个极其简单的解决方案。这正是我正在寻找的,因为 \n 是我可以轻松更改为
      的选择。然而,这仅适用于 html 输出,至少对我而言。它也适用于您的 pdf 输出吗?
    • 你们俩都是对的。我采用了双重用途的方法。
    【解决方案2】:

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

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

    更多详情here

    【讨论】:

    • 谢谢。不幸的是,这给我带来了一个错误:Error in linebreak(c("one\ntwo", "three\nfour")) : could not find function "linebreak"linebreak函数来自什么包?
    • kableExtra,您首先需要安装然后将库(kableExtra)添加到您的脚本中...
    • 谢谢,@snoram。不幸的是,我安装了旧版本的 kableExtra。改变了那个。现在代码运行。对于 pdf 输出,它可以完美运行,对于 html 输出,它会生成一个空的col2。它也适用于您的 html 输出吗?
    • 我刚刚检查过,它在html 中不起作用。因此,如果有一个适用于两者的解决方案很重要,您可以使用 Roman 的解决方案或提出一个新问题。
    猜你喜欢
    • 2020-11-24
    • 1970-01-01
    • 2018-02-24
    • 2016-01-27
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多