使用 pwalk 从具有不同tab_styles输入的 tibble 创建多个 gt 表

Use pwalk to create multiple gt tables from tibble with different tab_styles inputs

提问人:Victor 提问时间:10/22/2023 更新时间:10/22/2023 访问量:28

问:

我想使用 pwalk 函数创建并保存几个 gt 表。我正在使用下面的核心代码,其中面临的最大问题与参数有关:especifico

pwalk(tibble(filtro = list(c("Agropecuária", "Indústria", "Serviços", "PIB (pm)", sub_demanda, "Valor Adicionado (pb)", "Impostos (líq. s/ prod.)"), c("Indústria", sub_industria), c("Serviços", sub_servicos)),
                
                titulo = c("**Tabela 1. Variação do PIB (%)**", "**Tabela 2. Variação do PIB na Indústria (%)**", "**Tabela 3. Variação do PIB nos Serviços (%)**"),
               
                especifico = list(quos(style = list(cell_borders(sides = c("top"), color = "black", weight = px(2.5), style = "solid"),
                                                    cell_text(weight = "bold")),
                                       locations = list(cells_body(rows = 4), cells_stub(rows = 9:11))), 
                 
                                  quos(style = cell_borders(sides = c("bottom"), color = "black", weight = px(2.5), style = "solid"),
                                       locations = list(cells_body(rows = 1), cells_stub(rows = 1))),
                 
                                  quos(style = cell_borders(sides = c("bottom"), color = "black", weight = px(2.5), style = "solid"),
                                       locations = list(cells_body(rows = 1), cells_stub(rows = 1)))),
                
               save = c("PIB", "PIB_Industria", "PIB_Serviços")
               ), 
        function(filtro, titulo, especifico, save) {
          
          pib_tri %>% 
            filter(setores_e_subsetores %in% filtro,
                   variavel != "Número-índice") %>% 
            pivot_wider(names_from = "variavel", values_from = "valor") %>% 
            arrange(setores_e_subsetores) %>% 
            
            gt(rowname_col = "setores_e_subsetores", groupname_col = NA) %>%
            cols_hide(c(mes, trimestre)) %>% 
            tab_header(title = md(titulo),
                       subtitle = md(unique(.$`_data`$trimestre))) %>% 
            tab_source_note(source_note = md("Fonte: IBGE. Elaboração própria.")) %>%
            tab_spanner(label = "QoQ (SA)",
                        columns = c(QoQ, `QoQ Anualizado`)) %>% 
            
            tab_style(style = cell_text(weight = "bold"),
                      locations = cells_body(columns = 5)) %>%
            
            tab_style(style = cell_text(color = "black"),
                      locations = cells_body()) %>%
            
            tab_style(style = cell_text(color = "darkgrey", font = google_font("Source Sans Pro")), 
                      locations = cells_column_labels(everything())) %>% 
            
            tab_style(!!especifico) %>% 
            
            opt_table_font(font = list(google_font("Lato"), default_fonts())) %>% 
            
            tab_options(heading.title.font.size = 25,
                        heading.subtitle.font.size = 22,
                        heading.align = "left",
                        
                        table.border.top.style = "hidden",
                        heading.border.bottom.style = "hidden",
                        
                        table.font.size = 20,
                        
                        source_notes.border.bottom.style = "hidden",
                        source_notes.padding = px(10),
                        
                        data_row.padding = px(10)) %>%
            fmt_number(decimals = 2) %>% 
            cols_align("center") %>%
            cols_width(stub() ~ px(300),
                       everything() ~ px(130)) %>% 
            gtsave(paste0(save, ".png")) 
          
        })

基本上,我正在尝试传递特定于每个单独表的函数参数。但出现以下错误消息:tab_style

Error in `pmap()`:
ℹ In index: 1.
Caused by error in `as_locations()`:
! missing "locals" argument, no default 

没有这部分的 pwalk 本身工作正常。我以前合作过,但不幸的是,我在这个主题上不是那么先进。我错过了什么?提前致谢!quos()

可重复的数据:

structure(list(mes = structure(c(19509, 19509, 19509, 19509, 
19509, 19509, 19509, 19509, 19509, 19509, 19509, 19509, 19509, 
19509, 19509, 19509, 19509, 19509, 19509, 19509, 19509, 19509, 
19509, 19509, 19509, 19509, 19509, 19509, 19509, 19509, 19509, 
19509, 19509, 19509, 19509, 19509, 19509, 19509, 19509, 19509, 
19509, 19509, 19509, 19509, 19509, 19509, 19509, 19509, 19509, 
19509, 19509, 19509, 19509, 19509, 19509, 19509, 19509, 19509, 
19509, 19509, 19509, 19509, 19509, 19509, 19509, 19509, 19509, 
19509, 19509, 19509, 19509, 19509, 19509, 19509, 19509, 19509, 
19509, 19509, 19509, 19509, 19509, 19509, 19509, 19509, 19509, 
19509, 19509, 19509, 19509, 19509, 19509, 19509, 19509, 19509, 
19509, 19509, 19509, 19509, 19509, 19509, 19509, 19509, 19509, 
19509, 19509, 19509, 19509, 19509, 19509, 19509, 19509, 19509, 
19509, 19509, 19509, 19509, 19509, 19509, 19509, 19509, 19509, 
19509, 19509, 19509, 19509, 19509, 19509, 19509, 19509, 19509, 
19509, 19509), class = "Date"), trimestre = c("2º trimestre 2023", 
"2º trimestre 2023", "2º trimestre 2023", "2º trimestre 2023", 
"2º trimestre 2023", "2º trimestre 2023", "2º trimestre 2023", 
"2º trimestre 2023", "2º trimestre 2023", "2º trimestre 2023", 
"2º trimestre 2023", "2º trimestre 2023", "2º trimestre 2023", 
"2º trimestre 2023", "2º trimestre 2023", "2º trimestre 2023", 
"2º trimestre 2023", "2º trimestre 2023", "2º trimestre 2023", 
"2º trimestre 2023", "2º trimestre 2023", "2º trimestre 2023", 
"2º trimestre 2023", "2º trimestre 2023", "2º trimestre 2023", 
"2º trimestre 2023", "2º trimestre 2023", "2º trimestre 2023", 
"2º trimestre 2023", "2º trimestre 2023", "2º trimestre 2023", 
"2º trimestre 2023", "2º trimestre 2023", "2º trimestre 2023", 
"2º trimestre 2023", "2º trimestre 2023", "2º trimestre 2023", 
"2º trimestre 2023", "2º trimestre 2023", "2º trimestre 2023", 
"2º trimestre 2023", "2º trimestre 2023", "2º trimestre 2023", 
"2º trimestre 2023", "2º trimestre 2023", "2º trimestre 2023", 
"2º trimestre 2023", "2º trimestre 2023", "2º trimestre 2023", 
"2º trimestre 2023", "2º trimestre 2023", "2º trimestre 2023", 
"2º trimestre 2023", "2º trimestre 2023", "2º trimestre 2023", 
"2º trimestre 2023", "2º trimestre 2023", "2º trimestre 2023", 
"2º trimestre 2023", "2º trimestre 2023", "2º trimestre 2023", 
"2º trimestre 2023", "2º trimestre 2023", "2º trimestre 2023", 
"2º trimestre 2023", "2º trimestre 2023", "2º trimestre 2023", 
"2º trimestre 2023", "2º trimestre 2023", "2º trimestre 2023", 
"2º trimestre 2023", "2º trimestre 2023", "2º trimestre 2023", 
"2º trimestre 2023", "2º trimestre 2023", "2º trimestre 2023", 
"2º trimestre 2023", "2º trimestre 2023", "2º trimestre 2023", 
"2º trimestre 2023", "2º trimestre 2023", "2º trimestre 2023", 
"2º trimestre 2023", "2º trimestre 2023", "2º trimestre 2023", 
"2º trimestre 2023", "2º trimestre 2023", "2º trimestre 2023", 
"2º trimestre 2023", "2º trimestre 2023", "2º trimestre 2023", 
"2º trimestre 2023", "2º trimestre 2023", "2º trimestre 2023", 
"2º trimestre 2023", "2º trimestre 2023", "2º trimestre 2023", 
"2º trimestre 2023", "2º trimestre 2023", "2º trimestre 2023", 
"2º trimestre 2023", "2º trimestre 2023", "2º trimestre 2023", 
"2º trimestre 2023", "2º trimestre 2023", "2º trimestre 2023", 
"2º trimestre 2023", "2º trimestre 2023", "2º trimestre 2023", 
"2º trimestre 2023", "2º trimestre 2023", "2º trimestre 2023", 
"2º trimestre 2023", "2º trimestre 2023", "2º trimestre 2023", 
"2º trimestre 2023", "2º trimestre 2023", "2º trimestre 2023", 
"2º trimestre 2023", "2º trimestre 2023", "2º trimestre 2023", 
"2º trimestre 2023", "2º trimestre 2023", "2º trimestre 2023", 
"2º trimestre 2023", "2º trimestre 2023", "2º trimestre 2023", 
"2º trimestre 2023", "2º trimestre 2023", "2º trimestre 2023", 
"2º trimestre 2023", "2º trimestre 2023"), setores_e_subsetores = structure(c(1L, 
1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 
3L, 4L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 5L, 6L, 6L, 6L, 
6L, 6L, 6L, 7L, 7L, 7L, 7L, 7L, 7L, 8L, 8L, 8L, 8L, 8L, 8L, 9L, 
9L, 9L, 9L, 9L, 9L, 10L, 10L, 10L, 10L, 10L, 10L, 11L, 11L, 11L, 
11L, 11L, 11L, 12L, 12L, 12L, 12L, 12L, 12L, 13L, 13L, 13L, 13L, 
13L, 13L, 14L, 14L, 14L, 14L, 14L, 14L, 20L, 20L, 20L, 20L, 20L, 
20L, 22L, 22L, 22L, 22L, 22L, 22L, 15L, 15L, 15L, 15L, 15L, 15L, 
16L, 16L, 16L, 16L, 16L, 16L, 17L, 17L, 17L, 17L, 17L, 17L, 18L, 
18L, 18L, 18L, 18L, 18L, 19L, 19L, 19L, 19L, 19L, 19L, 21L, 21L, 
21L, 21L, 21L, 21L), levels = c("Agropecuária", "Indústria", 
"Indústrias extrativas", "Indústrias de transformação", "Eletricidade e gás, água, esgoto, atividades de gestão de resíduos", 
"Construção", "Serviços", "Comércio", "Transporte, armazenagem e correio", 
"Informação e comunicação", "Atividades financeiras, de seguros e serviços relacionados", 
"Atividades imobiliárias", "Outras atividades de serviços", 
"Administração, saúde e educação públicas e seguridade social", 
"Consumo das Famílias", "Consumo do Governo", "FBCF", "Exportação", 
"Importação (-)", "Valor Adicionado (pb)", "Impostos (líq. s/ prod.)", 
"PIB (pm)"), class = "factor"), variavel = c("Número-índice", 
"QoQ", "QoQ Anualizado", "YoY", "12m", "YTD", "Número-índice", 
"QoQ", "QoQ Anualizado", "YoY", "12m", "YTD", "Número-índice", 
"QoQ", "QoQ Anualizado", "YoY", "12m", "YTD", "Número-índice", 
"QoQ", "QoQ Anualizado", "YoY", "12m", "YTD", "Número-índice", 
"QoQ", "QoQ Anualizado", "YoY", "12m", "YTD", "Número-índice", 
"QoQ", "QoQ Anualizado", "YoY", "12m", "YTD", "Número-índice", 
"QoQ", "QoQ Anualizado", "YoY", "12m", "YTD", "Número-índice", 
"QoQ", "QoQ Anualizado", "YoY", "12m", "YTD", "Número-índice", 
"QoQ", "QoQ Anualizado", "YoY", "12m", "YTD", "Número-índice", 
"QoQ", "QoQ Anualizado", "YoY", "12m", "YTD", "Número-índice", 
"QoQ", "QoQ Anualizado", "YoY", "12m", "YTD", "Número-índice", 
"QoQ", "QoQ Anualizado", "YoY", "12m", "YTD", "Número-índice", 
"QoQ", "QoQ Anualizado", "YoY", "12m", "YTD", "Número-índice", 
"QoQ", "QoQ Anualizado", "YoY", "12m", "YTD", "Número-índice", 
"QoQ", "QoQ Anualizado", "YoY", "12m", "YTD", "Número-índice", 
"QoQ", "QoQ Anualizado", "YoY", "12m", "YTD", "Número-índice", 
"QoQ", "QoQ Anualizado", "YoY", "12m", "YTD", "Número-índice", 
"QoQ", "QoQ Anualizado", "YoY", "12m", "YTD", "Número-índice", 
"QoQ", "QoQ Anualizado", "YoY", "12m", "YTD", "Número-índice", 
"QoQ", "QoQ Anualizado", "YoY", "12m", "YTD", "Número-índice", 
"QoQ", "QoQ Anualizado", "YoY", "12m", "YTD", "Número-índice", 
"QoQ", "QoQ Anualizado", "YoY", "12m", "YTD"), valor = c(274.76, 
-0.890956967139211, -3.51648187758873, 17, 11.2, 17.9, 138.23, 
0.89044595285015, 3.60964049147785, 1.5, 2.2, 1.7, 237.02, 1.84333777338548, 
7.57974167468622, 8.8, 3.5, 8.2, 114.47, 0.341865357643756, 1.37448974138414, 
-1.7, 0, -1.3, 212.27, 0.449555176982774, 1.81038308221939, 4.8, 
8.1, 5.6, 148.06, 0.721088435374151, 2.91570210107968, 0.3, 2.9, 
0.9, 192.2, 0.612469245668223, 2.47247613743693, 2.3, 3.3, 2.6, 
162.02, 0.0555795714197505, 0.222503699690191, 0.1, 1.5, 0.9, 
179.22, 0.895119067725059, 3.62883808302379, 3.4, 5.6, 4.2, 407.74, 
0.728772943995648, 2.94711348173489, 3.8, 5.6, 5.3, 225.46, 1.3166764031816, 
5.37163987870506, 6.9, 3.9, 5.8, 224.68, 0.505479758443306, 2.03730134824023, 
2.8, 3, 2.8, 188.79, 1.27132281943998, 5.18309150889384, 2.4, 
6.2, 3.3, 155.89, 0.418706518938405, 1.68537437766743, 1.6, 0.8, 
1, 181.85, 0.603009515379505, 2.43394312891887, 3.4, 3.2, 3.8, 
184.46, 0.908096280087523, 3.68216367220411, 3.4, 3.2, 3.7, 195.2, 
0.941152135691392, 3.81808882463079, 3, 3.9, 3.2, 152.44, 0.740153317472902, 
2.99364537637679, 2.9, 1.4, 2, 170.13, 0.129480313106933, 0.518928030100563, 
-2.6, 1.7, -0.9, 362.83, 2.851716415795, 11.9041453782132, 12.1, 
9.8, 9.7, 261.99, 4.53674886282021, 19.4196947981818, 2.1, 4.9, 
2.1, NA, NA, NA, 3.3, 3, 3.1)), class = c("grouped_df", "tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -132L), groups = structure(list(
    setores_e_subsetores = structure(1:22, levels = c("Agropecuária", 
    "Indústria", "Indústrias extrativas", "Indústrias de transformação", 
    "Eletricidade e gás, água, esgoto, atividades de gestão de resíduos", 
    "Construção", "Serviços", "Comércio", "Transporte, armazenagem e correio", 
    "Informação e comunicação", "Atividades financeiras, de seguros e serviços relacionados", 
    "Atividades imobiliárias", "Outras atividades de serviços", 
    "Administração, saúde e educação públicas e seguridade social", 
    "Consumo das Famílias", "Consumo do Governo", "FBCF", "Exportação", 
    "Importação (-)", "Valor Adicionado (pb)", "Impostos (líq. s/ prod.)", 
    "PIB (pm)"), class = "factor"), .rows = structure(list(1:6, 
        7:12, 13:18, 19:24, 25:30, 31:36, 37:42, 43:48, 49:54, 
        55:60, 61:66, 67:72, 73:78, 79:84, 97:102, 103:108, 109:114, 
        115:120, 121:126, 85:90, 127:132, 91:96), ptype = integer(0), class = c("vctrs_list_of", 
    "vctrs_vctr", "list"))), row.names = c(NA, -22L), .drop = TRUE, class = c("tbl_df", 
"tbl", "data.frame")))
r 噜咕 gt quosure

评论


答:

1赞 stefan 10/22/2023 #1

无需法定人数。您可以简单地使用 .list

并作为一个建议。特别是在使用和处理大型函数时:将代码拆分为多个部分,以便于测试和调试!mapwalk

注意:即使在修复后,我也遇到了错误

数据中不存在以下行索引:9、 10, 11.

因此,我删除了导致问题的。cells_stub(rows = 9:11))

library(tidyverse)
library(gt)

tab_specs <- tibble(
  filtro = list(
    c("Agropecuária", "Indústria", "Serviços", "PIB (pm)", "sub_demanda", "Valor Adicionado (pb)", "Impostos (líq. s/ prod.)"),
    c("Indústria", "sub_industria"),
    c("Serviços", "sub_servicos")
  ),
  titulo = c("**Tabela 1. Variação do PIB (%)**", "**Tabela 2. Variação do PIB na Indústria (%)**", "**Tabela 3. Variação do PIB nos Serviços (%)**"),
  especifico = list(
    list(
      style = list(
        cell_borders(sides = c("top"), color = "black", weight = px(2.5), style = "solid"),
        cell_text(weight = "bold")
      ),
      locations = list(
        cells_body(rows = 4),
        cells_stub(rows = 1:2)
      )
    ),
    list(
      style = cell_borders(sides = c("bottom"), color = "black", weight = px(2.5), style = "solid"),
      locations = list(cells_body(rows = 1), cells_stub(rows = 1))
    ),
    list(
      style = cell_borders(sides = c("bottom"), color = "black", weight = px(2.5), style = "solid"),
      locations = list(cells_body(rows = 1), cells_stub(rows = 1))
    )
  ),
  save = c("PIB", "PIB_Industria", "PIB_Serviços")
)

table_fun <- function(filtro, titulo, especifico, save) {
  data <- pib_tri %>%
    filter(
      setores_e_subsetores %in% filtro,
      variavel != "Número-índice"
    ) %>%
    pivot_wider(names_from = "variavel", values_from = "valor") %>%
    arrange(setores_e_subsetores)

  data %>%
    gt(rowname_col = "setores_e_subsetores", groupname_col = NA) %>%
    cols_hide(c(mes, trimestre)) %>%
    tab_header(
      title = md(titulo),
      subtitle = md(unique(.$`_data`$trimestre))
    ) %>%
    tab_source_note(source_note = md("Fonte: IBGE. Elaboração própria.")) %>%
    tab_spanner(
      label = "QoQ (SA)",
      columns = c(QoQ, `QoQ Anualizado`)
    ) %>%
    tab_style(
      style = cell_text(weight = "bold"),
      locations = cells_body(columns = 5)
    ) %>%
    tab_style(
      style = cell_text(color = "black"),
      locations = cells_body()
    ) %>%
    tab_style(
      style = cell_text(
        color = "darkgrey",
        font = google_font("Source Sans Pro")
      ),
      locations = cells_column_labels(everything())
    ) %>%
    tab_style(
      style = especifico$style,
      locations = especifico$locations
    ) %>%
    opt_table_font(font = list(google_font("Lato"), default_fonts())) %>%
    tab_options(
      heading.title.font.size = 25,
      heading.subtitle.font.size = 22,
      heading.align = "left",
      table.border.top.style = "hidden",
      heading.border.bottom.style = "hidden",
      table.font.size = 20,
      source_notes.border.bottom.style = "hidden",
      source_notes.padding = px(10),
      data_row.padding = px(10)
    ) %>%
    fmt_number(decimals = 2) %>%
    cols_align("center") %>%
    cols_width(
      stub() ~ px(300),
      everything() ~ px(130)
    ) %>%
    gtsave(paste0(save, ".png"))
}

pwalk(tab_specs, table_fun)

enter image description here