如何在 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.

评估每个列表项

结果如下所示: