【问题标题】:How to use pagedown and kable in R to print a table followed by a page break如何在 R 中使用 pagedown 和 kable 打印表格,然后是分页符
【发布时间】:2020-09-21 21:50:19
【问题描述】:

这几天一直在摸索。

我正在使用pagedown 包编写带有可变长度表的报告。我最熟悉并最满意使用 kableExtra 表。但是,由于长度可变,并且 longtable 选项(据我所知)面向乳胶而不是 html 分页选项,因此我正在尝试分组和打印表块。一个简化的例子是每 10 行写入一个表并插入一个等效的分页符。

这是一个最小的例子。在这个例子中,内容可能会从边缘溢出,这很好,我只关心垂直间距。

---
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  ')
}
```

【问题讨论】:

  • 为什么不输出为html_document
  • 最终目标是可打印输出。 pagedown 的 html_paged 输出提供了(大部分)可靠的输出,可以在浏览器中查看和打印。

标签: r kableextra pagedown


【解决方案1】:

通常您在自定义样式表中为您的元素定义分页符。使用knitr::kable 生成的表格是经典的table HTML 元素。如果我们想在每个表格之后有一个分页符,我们可以在样式表中定义它(例如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 评估每个列表项。

结果如下:

【讨论】:

  • 我不知道你可以在summarise() 中使用kable()。 @MartinSchmelzer 赞!
【解决方案2】:

好的,所以我努力定义导致分页符等的 css 规则,我认为这与 paged.js 在呈现 pagedown 文档中的功能有关。

Pagedown 生成 css 类 .page-break-before,您猜对了,它呈现分页符。

我的解决方案是在 for 循环内容周围包裹一个带有 page-break-before 类的 div。

for (i in 1:length(tabs)) {
  htmltools::HTML(
    cat(
      paste0(
        div(class = 'page-break-before', tabs[i])
        )
      )
    )
}

让 pagedown 为我处理分页符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-06
    • 2013-08-04
    • 1970-01-01
    相关资源
    最近更新 更多