You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用gt打印跨页长表格时每页显示表头的解决方案及gt转kable方法

问题1:GT长表格跨页重复表头的解决办法

你遇到的表头仅在第一页显示的问题,核心是参数设置有误。GT包中控制longtable重复列表头的正确参数是latex.longtable.repeat_header = TRUE,而非page.header.use_tbl_headings(后者的作用是将表格标题放到页面页眉,并非重复表格的列表头)。

修正后的基础示例代码

---
title: "GT Long Table Example"
output: pdf_document
---

```{r, echo=FALSE}
library(gt)

data <- data.frame(
  ID = 1:200,
  Name = paste("Name", 1:200),
  Value = rnorm(200)
)

data %>%
  gt() %>%
  tab_header(
    title = "Example Long Table",
    subtitle = "This table spans multiple pages") %>%
  tab_options(
    latex.use_longtable = TRUE,
    latex.longtable.repeat_header = TRUE, # 关键参数:开启跨页重复列表头
    page.header.use_tbl_headings = TRUE # 可选:将表格标题放到每页页眉
  )
### 针对你更新的数据集代码的修正
你的代码存在管道符缺失(`%>`应改为`%>%`)、自定义函数`repeat_header_gt()`不存在的问题,修正后如下:
```r
library(tidyverse)
library(gt)

dat <- structure(list(StationCode = c("Gate 6", "Gate 7", "Gate 6", 
"Gate 7", "Gate 8", "Gate 8", "Gate 8", "Gate 7", "Gate 8", "Gate 7", 
"Gate 6", "Gate 8", "Gate 6", "Gate 8", "Gate 7", "Gate 7", "Gate 7", 
"Gate 7", "Gate 6", "Gate 8", "Gate 6", "Gate 3", "Gate 6", "Gate 6", 
"Gate 8", "Gate 8", "Gate 6", "Gate 8", "Gate 8", "Gate 7", "Gate 6", 
"Gate 7", "Gate 6", "Gate 8", "Gate 3"), SampleDate = structure(c(15387, 
15638, 15627, 15639, 15647, 15683, 15617, 15384, 15633, 15592, 
15627, 15688, 15370, 15660, 15657, 15688, 15650, 15366, 15662, 
15537, 15609, 15635, 15649, 15656, 15637, 15643, 15626, 15653, 
15393, 15627, 15626, 15684, 15632, 15612, 15593), class = "Date"), 
    WaterTemperature = c(49.2000007629395, 53.5, 55.5, 53.5, 
    54.7000007629395, 50.2000007629395, 57.0999984741211, 49.5999984741211, 
    55.4000015258789, 57.9000015258789, 55.5, 48.2999992370605, 
    48.5999984741211, 53, 52.0999984741211, 48.2999992370605, 
    55.4000015258789, 48.7000007629395, 52.7000007629395, 57, 
    56.7999992370605, 53.7000007629395, 55.5, 51.5, 53, 55.0999984741211, 
    54.5, 51.7999992370605, 50.7999992370605, 55.5, 54.5, 51, 
    55.7000007629395, 57.0999984741211, 57.7000007629395), Turbidity = c(2.0699999332428, 
    1.17999994754791, 1.48000001907349, 1.22000002861023, 1.45000004768372, 
    14.3000001907349, 1.16999995708466, 6.53000020980835, 1.14999997615814, 
    1.01999998092651, 1.48000001907349, 14, 2.70000004768372, 
    1.13999998569489, 1.28999996185303, 13.8999996185303, 1.29999995231628, 
    9.9399995803833, 48.7999992370605, 1.98000001907349, 0.980000019073486, 
    1.51999998092651, 1.1599999666214, 1.07000005245209, 1.36000001430511, 
    1.67999994754791, 0.959999978542328, 1.03999996185303, 2.58999991416931, 
    0.779999971389771, 0.959999978542328, 7.46999979019165, 0.899999976158142, 
    1.37000000476837, 1.64999997615814), ForkLength = c(95, 62, 
    57, 47, 65, 49, 33, 76, 39, 38, 38, 60, 90, 60, 55, 58, 67, 
    121, 44, 32, 39, 57, 43, 49, 52, 52, 55, 45, 83, 36, 33, 
    81, 58, 33, 32), Count = c(2, 3, 1, 2, 1, 1, 4, 1, 7, 1, 
    7, 1, 1, 2, 10, 1, 2, 1, 6, 1, 1, 1, 1, 5, 2, 1, 1, 3, 1, 
    26, 2, 1, 3, 3, 1), year = c("2012", "2012", "2012", "2012", 
    "2012", "2012", "2012", "2012", "2012", "2012", "2012", "2012", 
    "2012", "2012", "2012", "2012", "2012", "2012", "2012", "2012", 
    "2012", "2012", "2012", "2012", "2012", "2012", "2012", "2012", 
    "2012", "2012", "2012", "2012", "2012", "2012", "2012"), 
    race2 = c("Winter", "Winter", "Winter", "Winter", "Winter", 
    "Winter", "Winter", "Winter", "Winter", "Winter", "Winter", 
    "Winter", "Winter", "Winter", "Winter", "Winter", "Winter", 
    "Winter", "Winter", "Winter", "Winter", "Winter", "Winter", 
    "Winter", "Winter", "Winter", "Winter", "Winter", "Winter", 
    "Winter", "Winter", "Winter", "Winter", "Winter", "Winter"
    ), week = c("07", "43", "41", "43", "44", "49", "40", "07", 
    "42", "36", "41", "50", "05", "46", "46", "50", "45", "04", 
    "46", "29", "39", "43", "45", "46", "43", "44", "41", "45", 
    "08", "41", "41", "50", "42", "39", "37"), month = c("February", 
    "October", "October", "October", "November", "December", 
    "October", "February", "October", "September", "October", 
    "December", "January", "November", "November", "December", 
    "November", "January", "November", "July", "September", "October", 
    "November", "November", "October", "October", "October", 
    "November", "February", "October", "October", "December", 
    "October", "September", "September")), row.names = c(NA, 
35L), class = "data.frame")

dat_gt <- dat %>%
  group_by(race2, year) %>%
  mutate(obs = row_number()) %>%
  pivot_wider(names_from = "race2", values_from = "Count", values_fill = 0) %>%
  arrange(year, obs) %>%
  select(-obs)

dat_gt |>
  mutate(SampleDate = as.character(SampleDate)) |>
  group_by(year, month, week) |>
  summarise(across(c(Winter), sum), across(c(Turbidity,WaterTemperature), mean)) |>
  arrange(desc(year),desc(week),desc(month)) |>
  gt() |>
  summary_rows( 
    columns = c(Winter),
    fns =  list(label = "Total", fn = "sum"),
    side = "bottom") |>
  
  summary_rows( 
    columns = c(Turbidity,WaterTemperature),
    fns =  list(label="avg",fn = "mean"),
    fmt = ~ fmt_number(., decimals = 1, use_seps = FALSE)) |>
  fmt_number(columns = c(Turbidity,WaterTemperature),
             decimals = 1) |>

  grand_summary_rows(columns = c(Winter),
                     fns = list(label = "Grand Total", fn = "sum")) |>
  tab_header(title = "Fish Observations",
             subtitle = "Total number of fish by year,month, and week") %>%
  tab_options(
    latex.use_longtable = TRUE,
    latex.longtable.repeat_header = TRUE # 开启跨页重复表头
  )
### 额外注意事项
- 确保你的GT包是最新版本,旧版本可能不支持`latex.longtable.repeat_header`参数,可通过`install.packages("gt")`更新。
- 如果需要表格的标题(`tab_header`内容)也在每页显示,可同时添加`page.header.use_tbl_headings = TRUE`,此时标题会出现在页面页眉位置,而非表格上方。

# 问题2:将GT表格转为Kable的方法

GT包官方没有提供直接转换为kable对象的函数,但可以通过以下两种方式实现:

## 方法1:提取数据框后重新生成kable(丢失格式)
如果不需要保留GT中的格式(如汇总行、样式),可以直接提取GT对象的底层数据框,再用`kable()`生成表格:
```r
library(gt)
library(kableExtra)

# 生成GT表格
gt_table <- data %>% gt() %>% tab_header(title = "Test Table")

# 提取底层数据框
gt_data <- gt_table[["_data"]]

# 生成kable表格
kable_table <- kable(gt_data, "latex") %>% kable_styling()

方法2:通过LaTeX/HTML代码转换(保留格式)

如果需要保留GT的格式,可以先将GT对象渲染为LaTeX或HTML代码,再转换为kable:

library(gt)
library(kableExtra)

# 生成GT表格并渲染为LaTeX代码
gt_latex <- gt_table %>% render_as_latex()

# 将LaTeX代码转换为kable对象
kable_table <- read_latex(gt_latex) %>% kable_styling()

这种方法能保留大部分格式,但部分GT专属样式可能无法完全兼容kableExtra。

内容的提问来源于stack exchange,提问作者Salvador

火山引擎 最新活动