таблица с длинным текстом, маркированным списком и определенной шириной таблицы

Я хочу, чтобы таблица имела маркированный список в одном столбце и имела определенную ширину таблицы (чтобы ее можно было разместить на одной странице при отображении в PDF).

Как я могу добиться этого в rmarkdown, используя один из множества имеющихся пакетов?


Что я пробовал и до сих пор:

---
output: pdf_document
---

```{r, include = FALSE}
df <- data.frame(col1 = "Some really long text here. I mean some reeeeeaaly loooong text. So long, it should be wrapped. Really.",
                 col2 = "* bullet point 1\n * bullet point 2", col3 = "Yes, there is still another column.")
```

# Attempt 1: kableExtra
```{r, echo = FALSE, warning = FALSE}
library(kableExtra)
df1 <- df
df1$col2 <- linebreak(df1$col2)
knitr::kable(df1, escape = FALSE) %>% column_spec(1, width = "15em")
```

# Attempt 2: pander
```{r, echo = FALSE}
pander::pander(df, keep.line.breaks = TRUE, style = 'grid', justify = 'left')
```

Это дает:

введите описание изображения здесь

Как видите, у обоих вариантов есть свои оговорки. Версия kableExtra имеет определенную ширину таблицы, которая умещается на одной странице, но не отображает четко маркеры. В то время как решение pander хорошо отображает маркеры, но охватывает несколько страниц, потому что я не знаю, как указать ширину таблицы в pander.

Есть ли решение, которое может сделать и то, и другое?

Связанные вопросы, например, здесь и здесь.


person symbolrush    schedule 24.10.2018    source источник


Ответы (2)


Используйте параметр split.table для pandoc.table (который вызывается pander в фоновом режиме) или отключите разделение таблицы в целом с помощью table.split.table panderOptions, например

pander::pander(df, keep.line.breaks = TRUE, style = 'grid', justify = 'left', split.table = Inf)

or

library(pander)
panderOptions('table.style', 'grid')
panderOptions('table.alignment.default', 'left')
panderOptions('table.split.table', Inf)
panderOptions('keep.line.breaks', TRUE)
pander(df)

пример угощения

person daroczig    schedule 24.10.2018
comment
Спасибо, @daroczig. Ваше решение отлично работает для примера в вопросе. Однако в моем реальном примере таблица все еще разделена на две страницы. Ты хоть представляешь, почему это все еще может происходить? Тексты столбцов слишком длинные? - person symbolrush; 24.10.2018
comment
@daroczig Иногда мне приходится работать с _1 _ / _ 2_ таблицами. Если они содержат список маркеров, они всегда создают пустое пространство сразу после списка, как и при компиляции вашего кода. Вы бы хоть представляли, откуда могло взяться это пустое пространство и как избежать / избавиться от него? - person mavericks; 08.07.2020

Альтернативное решение на основе kableExtra (необязательно: со сносками)

Этот подход позволяет добавлять заголовок, вручную добавлять сноски в таблицу и фиксировать ширину столбцов.

Чтобы создать список маркеров:

  • более толстые \cdots от LaTex используются в качестве пуль (альтернативы см. здесь)
  • разрывы строк принудительно вводятся с помощью \n (поэтому отступы не так хороши, как с подходом pander от @daroczig).

MWE

library(stringi); library(kableExtra); library(dplyr)
string_short <- "Descriptor"
string_long <- substr(stri_rand_lipsum(1), 1, 50)

# add footnotes manually within table
string_bulletlist <- "$\\boldsymbol{\\cdot}$ bullet point 1: foo$^{a}$ \n $\\boldsymbol{\\cdot}$ bullet point 2: bar$^{b}$"

df <- data.frame(col1 = c(string_short, string_short),
                 col2 = c(string_bulletlist, string_bulletlist),
                 col3 = c(string_long, string_long)
)
col_names <- c("Descriptor", "Description with list", "Some comment")

# header: bold column names
colnames(df) <- paste0("\\textbf{", col_names,"}")

# add footnote with kableExtra commands
names(df)[1] <- paste0(names(df)[1], footnote_marker_symbol(1))

df %>%
  mutate_all(linebreak) %>% # required for linebreaks to work
  kable(
    "latex",  
    escape = F, 
    booktabs=TRUE, 
    align = "l",
    caption = 'kableTable with bullet list and footnote') %>%
  # kable_styling(full_width = F) %>% # makes no difference here
  footnote(general = "General comment of the table.",
           alphabet = c("Footnote A;", "Footnote B;"),
           symbol = c("Footnote Symbol 1")) %>% 
  column_spec(1, width = "5em") %>% # fix width column 1
  column_spec(2, width = "10em") %>% # fix width column 2
  column_spec(3, width = "15em") # fix width column 3

Чтобы [улучшить межстрочный интервал [(https://stackoverflow.com/questions/53794142/increase-line-row-spacing-with-kableextra), можно добавить следующие фрагменты кода до и после в Rmd:

\renewcommand{\arraystretch}{1.5} <!-- increase line spacing for the table -->
RMD CHUNK HERE
\renewcommand{\arraystretch}{1} <!-- reset row hight/line spacing -->

kableExtra table

Комментарий:

Я также попробовал подход pander от @daroczig и получил следующий опыт:

  • Pro: хороший межстрочный интервал плюс настоящий список маркеров (по сравнению с $\boldsymbol{\cdot}$-обходным путем в подходе kableExtra).
  • Недостаток: после маркированного списка добавлено большое пустое пространство.

Кроме того, при использовании подхода pander в файле Rmd с использованием шаблона тезиса хаскида сноски сильно искажались выравнивание таблицы.

person mavericks    schedule 03.07.2020