在 rmarkdown pdf 输出中包装比例表的列名的有效方法
Efficient way to wrap column names of proportion tables in rmarkdown pdf output
我正在使用 questionr 包制作行比例加权表。当列名太长时,我想换行。因为我正在制作数百个表格,所以该解决方案需要处理具有不同列数的表格。我还想避免将所有列设置为特定宽度。理想情况下,短列名称将保持其正常宽度,而超过指定最大长度的名称将被换行。
以下是我目前尝试过的一堆解决方案,写成 .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 文件的输出如下所示:
至少,对于 kableExtra
,您需要在 kable
函数中将格式指定为 latex
或 html
。
要使其动态化,您可以在 table 进入 kable 之前将其保存到一个变量中,并在 column_spec
中使用 2:(ncol(your_table) + 1)函数(column_name 列 +1)。
我正在使用 questionr 包制作行比例加权表。当列名太长时,我想换行。因为我正在制作数百个表格,所以该解决方案需要处理具有不同列数的表格。我还想避免将所有列设置为特定宽度。理想情况下,短列名称将保持其正常宽度,而超过指定最大长度的名称将被换行。
以下是我目前尝试过的一堆解决方案,写成 .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 文件的输出如下所示:
至少,对于 kableExtra
,您需要在 kable
函数中将格式指定为 latex
或 html
。
要使其动态化,您可以在 table 进入 kable 之前将其保存到一个变量中,并在 column_spec
中使用 2:(ncol(your_table) + 1)函数(column_name 列 +1)。