【问题标题】:KableExtra adding linebreaks in columns with long nonwhitespace stringsKableExtra 在具有长非空白字符串的列中添加换行符
【发布时间】:2020-08-06 16:10:59
【问题描述】:

我有一个长字符串,我想要在一个表格中,例如 100x 字母 A (AAA...)。如果它们不适合表格,我希望 kable 将此字符串拆分为多行,而不是使这些字符串溢出,如图所示 here.

我注意到 kable 实际上能够这样做,前提是您的字符串中有换行符或 -,例如,请参阅 here

但是,我希望 kable 对选定字符或任何字符进行此拆分,因此输出结果将是 this,但我不知道如何实现这一点。我查看了 SO 和 kableextra 文档,但没有运气。有什么建议吗?

下面是一个可以玩的块。

---
title: 'rasstasrt'
sansfont: Calibri Light
output: pdf_document
---

```{r setup, include=FALSE}
library(kableExtra);
library(dplyr)
knitr::opts_chunk$set(cache = F)
```


```{r}
dt <-tibble(Items =c("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaaaaAAa", "Item 2", "Item 3"),
            Tmd5ext_1 =c("Lorem ipsum  "),
            Text_2 =c("Duis pos "))

kableExtra::kable(dt, "latex", booktabs = F, col.names =c("Item", "Short Title", "Veryong Title"))  %>% column_spec(1:3, width = "5cm", )
```

【问题讨论】:

标签: r r-markdown knitr kable kableextra


【解决方案1】:

您可以利用乳胶中的换行符\\kableExtra::kable() 中的参数escape = FALSE。设置escape = FALSE 会导致\\ 被读取为换行符而不是文字\\请注意,因为\ 是 R 中的转义字符,您需要两个斜杠 \\ 以便 R 解释单个斜杠 \,因此要获得 2 个文字斜杠 \\,您需要输入 4 \\\\ 在字符串中。

---
title: 'rasstasrt'
sansfont: Calibri Light
output: pdf_document
---

```{r setup, include=FALSE}
library(kableExtra)
library(dplyr)
knitr::opts_chunk$set(cache = F)
```


```{r}

dt <-tibble(Items = c("AAAAAAAAAAAAAAA\\\\AAAAAAAAAA\\\\AAAAAAAAAAA\\\\AAAAAAAAAAAAA\\\\AAAAAAaaaaAAa", 
                      "Item 2", 
                      "Item 3"),
            Tmd5ext_1 = c("Lorem ipsum  "),
            Text_2 = c("Duis pos "))

kableExtra::kable(dt, 
                  "latex", 
                  booktabs = F, 
                  col.names =c("Item", "Short Title", "Veryong Title"), 
                  escape = FALSE)  %>% 
  column_spec(1:3, width = "5cm")
```

或者,如果您想在特定数量的字符后插入换行符,您可以编写一个函数来执行此操作。

---
title: 'rasstasrt'
sansfont: Calibri Light
output: pdf_document
---

```{r setup, include=FALSE}
library(kableExtra)
library(dplyr)
knitr::opts_chunk$set(cache = F)
```


```{r}
add_return <- function(x, len) {
  # intialize empty vector
  y <- c()

  # start at beginning of string
  i <- 1

  # Break string up into lengths of len
  while(i < nchar(x)) {

    y <- c(y,substr(x, i, i + len - 1))

    i <- i + len

  }

  # concatenate the substrings together with the newline characters
  paste0(y, collapse = "\\\\") 

}

dt <-
  tibble(
    Items = c(
      add_return(
        "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaaaaAAa",
       len = 5
      ),
      "Item 2",
      "Item 3"
    ),
    Tmd5ext_1 = c("Lorem ipsum  "),
    Text_2 = c("Duis pos ")
  )

kableExtra::kable(
  dt,
  "latex",
  booktabs = F,
  col.names = c("Item", "Short Title", "Veryong Title"),
  escape = FALSE
)  %>% column_spec(1:3, width = "5cm")
```

您还可以使用正则表达式在特定字符串之后插入返回。

---
title: 'rasstasrt'
sansfont: Calibri Light
output: pdf_document
---

```{r setup, include=FALSE}
library(kableExtra)
library(dplyr)
knitr::opts_chunk$set(cache = F)
```


```{r}
regex_add_return <- function(x, after) {

  gsub(pattern = paste0("(",after,")"), replacement = paste0("\\1\\\\\\\\"),x)

}

dt <-
  tibble(
    Items = c(
      regex_add_return(
        "AAAAAAAAAAAAAAAz123AAAAAAAAAAAAAAAz123AAAAAAAAAAz123AAAAAAAAAAAAAAAaaaaAAa",
        after = "z123"
      ),
      "Item 2",
      "Item 3"
    ),
    Tmd5ext_1 = c("Lorem ipsum  "),
    Text_2 = c("Duis pos ")
  )

kableExtra::kable(
  dt,
  "latex",
  booktabs = F,
  col.names = c("Item", "Short Title", "Veryong Title"),
  escape = FALSE
)  %>% column_spec(1:3, width = "5cm")
```

请注意,gsub() 中有 8 个斜杠,因为斜杠也是正则表达式的转义字符,因此每个文字斜杠必须用斜杠转义,但是每个斜杠都用作转义字符对于 R,regex 也必须再次转义,需要另一个斜杠。

【讨论】:

  • 感谢您的回答。这些是原则上可行的解决方案,但我希望在 kableextra 中内置更多内容,这样我就不必自己动手了。
猜你喜欢
  • 1970-01-01
  • 2013-06-01
  • 1970-01-01
  • 2012-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 2010-09-19
相关资源
最近更新 更多