簡體   English   中英

如何在 R 中使用 pagedown 和 kable 打印表格后跟分頁符

[英]How to use pagedown and kable in R to print a table followed by a page break

幾天來一直在為這個問題撓頭。

我正在使用pagedown package 來編寫包含可變長度表的報告。 我最熟悉並滿足於使用 kableExtra 表。 但是,因為存在可變長度,並且 longtable 選項(據我所知)是面向 latex 而不是 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  ')
}
```

通常您在自定義樣式表中為您的元素定義分頁符。 使用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 styles:

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

我使用invisiblelapply中隱藏不需要的 output ,它使用cat評估每個列表項。

結果如下所示:

在此處輸入圖像描述

好吧,所以我努力定義導致分頁符等的 css 規則,我認為這與 paged.js 在呈現 pagedown 文檔時的功能有關。

Pagedown 生成 css class .page .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 為我處理分頁符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM