KableExtra 在具有长非空白字符串的列中添加换行符

joo*_*ost 2 r knitr r-markdown kableextra kable

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

我注意到 kable 实际上能够做到这一点,前提是-您的字符串中有换行符或 's,例如参见此处

但是,我希望 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", )
```
Run Code Online (Sandbox Code Playgroud)

Wil*_*Wil 5

您可以利用 Latex 中的换行符\\和. 设置导致被读取为换行符而不是文字。请注意,由于是 R 中的转义字符,因此您需要两个斜杠才能让 R 解释单个斜杠,因此要获得 2 个文字斜杠,您需要在字符串中放入 4 。escape = FALSEkableExtra::kable()escape = FALSE\\\\\\\\\\\\\\

---
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")
```
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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

---
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")
```
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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

---
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")
```
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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