Эффективный способ обернуть имена столбцов таблиц пропорций в выводе rmarkdown pdf

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

Вот несколько решений, которые я пробовал до сих пор, в виде файла .Rmd:

---
title: "Example"
output: pdf_document
---

```{r setup, include=FALSE}
library(questionr)
library(knitr)
data("happy")
```


A simple weighted table with the "kable" method:
```{r table1, echo=TRUE}
kable(wtd.table(happy$degree, happy$happy, weights = happy$wtssall),
  digits = 0)
```

The same "kable" table, but with row proportions:
```{r table2, echo=TRUE}
kable(rprop(wtd.table(happy$degree, happy$happy, weights = happy$wtssall)),
  digits = 0)
```

I want to wrap the column headers, but kableExtra::column_spec() gives an error.
Even if it worked it requires manually setting each column width.:
```{r table3, echo=TRUE}
library(kableExtra)
kable(rprop(wtd.table(happy$degree, happy$happy, weights = happy$wtssall)),
  digits = 0) %>%
  column_spec(column = 2, width = ".25in")
```

Maybe str_wrap will do the trick?
```{r table4, echo=TRUE}
library(stringr)
kable(rprop(wtd.table(happy$degree, str_wrap(happy$happy, width = 8),
                  weights = happy$wtssall)),
  digits = 0)
```

Giving up on knitr::kable(), maybe pander has a solution.
Here is the simple weighted frequency table.
```{r table5, echo=TRUE, results='asis'}
library(pander)
pandoc.table(wtd.table(happy$degree, str_wrap(happy$happy, width = 8),
                  weights = happy$wtssall),
         split.cells=8)
```

So far, so good. But it doesn't work for the table of row proportions,
because the rprop table is of class ([1]"proptab" [2]"table")
while the wtd.table() is just class "table"
```{r table6, echo=TRUE, results='asis', error=TRUE}
pandoc.table(rprop(wtd.table(happy$degree, str_wrap(happy$happy, width = 8),
                  weights = happy$wtssall)),
         split.cells=8)
```

But wait! I can pass a kable() product as pandoc output.
This table looks great, but I don't think I pass any
pandoc.table() arguments like "split.cells=8" to it.
```{r table7, echo=TRUE, results='asis', error=TRUE}
kable(rprop(wtd.table(happy$degree, happy$happy, weights = happy$wtssall)),
  digits = 0, format = "pandoc")
```

И вот как выглядит результат этого файла .Rmd:  введите описание изображения здесь

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


person John J.    schedule 12.01.2018    source источник


Ответы (1)


По крайней мере, для kableExtra вам нужно указать формат в вашей kable функции как latex или html. введите описание изображения здесь

Чтобы сделать ее динамической, вы можете сохранить таблицу в переменной до того, как она попадет в kable, и использовать 2: (ncol (your_table) + 1) в функции column_spec (+1 для столбца column_name).

person Hao    schedule 14.01.2018
comment
Спасибо, это похоже на то, что я искал. Проблема заключается в том, что это решение делает все столбцы шириной 0,5 дюйма. В моем вопросе я пытаюсь установить максимальную ширину столбца. Я бы не хотел растягивать более короткие столбцы. - person John J.; 16.01.2018
comment
Кроме того, вот однострочное решение для динамической длины таблицы: column = 2:(length(unique(happy$happy[!is.na(happy$happy)]))) - person John J.; 16.01.2018