如何在 R 中使用 pagedown 和 kable 打印 table 后跟分页符
How to use pagedown and kable in R to print a table followed by a page break
这几天一直在摸不着头脑。
我正在使用 pagedown 包编写可变长度 tables 的报告。我最熟悉并满足于使用 kableExtra tables。但是,因为有可变长度,并且 longtable 选项(据我所知)是面向乳胶的而不是 html 分页选项,所以我试图分组并打印 table秒。一个简化的示例是每 10 行写入一个 table 并插入相当于一个分页符。
这是一个最小的例子。在此示例中,内容可能会溢出边距,没关系,我只关心垂直间距。
---
output:
pagedown::html_paged:
toc: false
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = FALSE)
library(ggplot2)
library(kableExtra)
library(dplyr)
```
```{r, results='asis'}
tabs <-
ggplot2::mpg %>%
dplyr::group_by(grp = ceiling(row_number()/20)) %>%
summarise(tables = list(
kable(cur_data()) %>%
kable_styling() %>%
collapse_rows(1, valign = 'top'))) %>%
select(tables) %>%
unlist()
for (i in 1:length(tabs)) {
cat(tabs[i])
cat('\newpage ')
}
```
好吧,所以我努力定义导致分页等的 css 规则,我认为这与 paged.js 在呈现分页文档时的功能有关。
Pagedown 生成 css class .page-break-before
,您猜对了,它会呈现一个分页符。
我的解决方案是在 for 循环内容周围用 class page-break-before
包裹 div。
for (i in 1:length(tabs)) {
htmltools::HTML(
cat(
paste0(
div(class = 'page-break-before', tabs[i])
)
)
)
}
并让 pagedown 为我处理分页符。
通常您会在自定义样式表中为您的元素定义 page-breaks。使用 knitr::kable
生成的表格是经典的 table
HTML 元素。如果我们想在每个 table 之后有一个分页符,我们将在样式表(例如 custom.css
)中定义它,例如
table {
font-size: 0.5em; /* table width would extent the page margins otherwise */
break-after: page; /* move the content following a table to the next page */
}
在我们的 rmarkdown 文档中,我们只需要包含额外的 CSS 样式:
---
output:
pagedown::html_paged:
toc: false
css: [default, default-page, default-fonts, custom.css]
---
注意,我们首先包含三个默认样式表,然后添加我们的样式表。
完整的文档如下所示:
---
output:
pagedown::html_paged:
toc: false
css: [default, default-page, default-fonts, test.css]
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = FALSE)
library(ggplot2)
library(kableExtra)
library(dplyr)
library(knitr)
```
```{r, results = 'asis', message=F, warning=F}
tabs <-
ggplot2::mpg %>%
dplyr::group_by(grp = ceiling(row_number()/20)) %>%
summarise(tables = list(
kable(cur_data()) %>%
kable_styling() %>%
collapse_rows(1, valign = 'top'))) %>%
select(tables)
invisible(lapply(tabs$tables, cat))
```
我使用 invisible
来隐藏来自 lapply
的不需要的输出,它使用 cat
.
评估每个列表项
结果如下所示:
这几天一直在摸不着头脑。
我正在使用 pagedown 包编写可变长度 tables 的报告。我最熟悉并满足于使用 kableExtra tables。但是,因为有可变长度,并且 longtable 选项(据我所知)是面向乳胶的而不是 html 分页选项,所以我试图分组并打印 table秒。一个简化的示例是每 10 行写入一个 table 并插入相当于一个分页符。
这是一个最小的例子。在此示例中,内容可能会溢出边距,没关系,我只关心垂直间距。
---
output:
pagedown::html_paged:
toc: false
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = FALSE)
library(ggplot2)
library(kableExtra)
library(dplyr)
```
```{r, results='asis'}
tabs <-
ggplot2::mpg %>%
dplyr::group_by(grp = ceiling(row_number()/20)) %>%
summarise(tables = list(
kable(cur_data()) %>%
kable_styling() %>%
collapse_rows(1, valign = 'top'))) %>%
select(tables) %>%
unlist()
for (i in 1:length(tabs)) {
cat(tabs[i])
cat('\newpage ')
}
```
好吧,所以我努力定义导致分页等的 css 规则,我认为这与 paged.js 在呈现分页文档时的功能有关。
Pagedown 生成 css class .page-break-before
,您猜对了,它会呈现一个分页符。
我的解决方案是在 for 循环内容周围用 class page-break-before
包裹 div。
for (i in 1:length(tabs)) {
htmltools::HTML(
cat(
paste0(
div(class = 'page-break-before', tabs[i])
)
)
)
}
并让 pagedown 为我处理分页符。
通常您会在自定义样式表中为您的元素定义 page-breaks。使用 knitr::kable
生成的表格是经典的 table
HTML 元素。如果我们想在每个 table 之后有一个分页符,我们将在样式表(例如 custom.css
)中定义它,例如
table {
font-size: 0.5em; /* table width would extent the page margins otherwise */
break-after: page; /* move the content following a table to the next page */
}
在我们的 rmarkdown 文档中,我们只需要包含额外的 CSS 样式:
---
output:
pagedown::html_paged:
toc: false
css: [default, default-page, default-fonts, custom.css]
---
注意,我们首先包含三个默认样式表,然后添加我们的样式表。
完整的文档如下所示:
---
output:
pagedown::html_paged:
toc: false
css: [default, default-page, default-fonts, test.css]
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = FALSE)
library(ggplot2)
library(kableExtra)
library(dplyr)
library(knitr)
```
```{r, results = 'asis', message=F, warning=F}
tabs <-
ggplot2::mpg %>%
dplyr::group_by(grp = ceiling(row_number()/20)) %>%
summarise(tables = list(
kable(cur_data()) %>%
kable_styling() %>%
collapse_rows(1, valign = 'top'))) %>%
select(tables)
invisible(lapply(tabs$tables, cat))
```
我使用 invisible
来隐藏来自 lapply
的不需要的输出,它使用 cat
.
结果如下所示: