KableExtra добавляет разрывы строк в столбцах с длинными непробельными строками - PullRequest
1 голос
/ 23 апреля 2020

У меня есть длинная строка, которую я хочу в таблице, например, 100x буква A (AAA ...). Мне бы хотелось, чтобы kable разбил эту строку на несколько строк, если они не помещаются в таблицу, вместо того, чтобы переполнять эти строки, как показано здесь .

Я заметил, что kable действительно может при условии, что в вашей строке есть новые строки или -, см., например, здесь .

Однако я бы хотел, чтобы 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", )
```

1 Ответ

0 голосов
/ 23 апреля 2020

Вы можете использовать символ новой строки в латексе, \\ и аргумент escape = FALSE в kableExtra::kable(). При установке escape = FALSE \\ будет читаться как символы новой строки вместо литерала \\. Обратите внимание, что, поскольку \ является escape-символом в R, вам нужно две косые черты \\, чтобы R интерпретировал один сл: sh \, поэтому для получения двух буквенных слеш \\ вам нужно поместить 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")
```

enter image description here

В качестве альтернативы, если вы хотите вставить символ новой строки после указанного c количество символов, вы можете написать функцию для этого.

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

enter image description here

Вы также можете использовать регулярные выражения для вставки возврата после конкретная c символьная строка.

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

enter image description here

Обратите внимание, что в gsub() есть 8 косых черт, поскольку sla sh также escape-символ для регулярных выражений, поэтому каждый литерал sla sh должен быть экранирован с sla sh, но затем каждый sla sh, который используется как escape-символ для регулярного выражения, также должен быть экранирован снова для R , требующий другого сл sh.

...