Как сохранить несколько таблиц в виде изображений с помощью kable и карты?

#r

Вопрос:

Я пытаюсь создать несколько таблиц из одного фрейма данных и сохранить их в виде изображений. Когда я пытаюсь сохранить таблицы с помощью save_kable , что — то идет не так. Это прокси моего кода:

 table_list  %>%
  group_split(compound, .keep = FALSE) %>%
  setNames(unique(table_list$compound)) %>%
   map(~save_kable(file = paste0('output/final_plots/1. model performance/',
                            names(.),
                            'table_metrics.png'),
              width = 6, height = 4, 
              bs_theme = 'journal', 
              self_contained = T, 
              x = kbl(., booktabs = T, align = c('l','l', 'c')) %>%
   kable_styling() %>%
    add_header_above(c(' ' = 1,
                       ' ' = 1,
                       'Metrics' = 5))))
 

Идея состоит в том, чтобы создать одну таблицу для каждого разделения и сохранить ее в формате png. Есть какие-нибудь идеи, что может быть не так?

Это мой фрейм данных

 structure(list(`Avg type` = c("hourly", "hourly", "hourly", "hourly", 
"hourly", "hourly", "hourly", "hourly", "hourly", "hourly", "hourly", 
"hourly", "hourly", "hourly", "hourly", "hourly", "hourly", "hourly", 
"hourly", "hourly", "daily", "daily", "daily", "daily", "daily", 
"daily", "daily", "daily", "daily", "daily", "daily", "daily", 
"daily", "daily", "daily", "daily", "daily", "daily", "daily", 
"daily"), Scenario = c("CCTM EFmaps", "CCTM PFT", "GC EFmaps", 
"GC EFmaps LD", "GC PFT", "CCTM EFmaps", "CCTM PFT", "GC EFmaps", 
"GC EFmaps LD", "GC PFT", "CCTM EFmaps", "CCTM PFT", "GC EFmaps", 
"GC EFmaps LD", "GC PFT", "CCTM EFmaps", "CCTM PFT", "GC EFmaps", 
"GC EFmaps LD", "GC PFT", "CCTM EFmaps", "CCTM PFT", "GC EFmaps", 
"GC EFmaps LD", "GC PFT", "CCTM EFmaps", "CCTM PFT", "GC EFmaps", 
"GC EFmaps LD", "GC PFT", "CCTM EFmaps", "CCTM PFT", "GC EFmaps", 
"GC EFmaps LD", "GC PFT", "CCTM EFmaps", "CCTM PFT", "GC EFmaps", 
"GC EFmaps LD", "GC PFT"), compound = c("ISOP", "ISOP", "ISOP", 
"ISOP", "ISOP", "MACR_MVK", "MACR_MVK", "MACR_MVK", "MACR_MVK", 
"MACR_MVK", "MTP", "MTP", "MTP", "MTP", "MTP", "O3", "O3", "O3", 
"O3", "O3", "ISOP", "ISOP", "ISOP", "ISOP", "ISOP", "MACR_MVK", 
"MACR_MVK", "MACR_MVK", "MACR_MVK", "MACR_MVK", "MTP", "MTP", 
"MTP", "MTP", "MTP", "O3", "O3", "O3", "O3", "O3"), `Pearson coeff.` = c(0.73, 
0.74, 0.76, 0.76, 0.88, 0.34, 0.43, 0.66, 0.66, 0.79, 0.46, 0.48, 
0.26, 0.19, 0.3, 0.52, 0.64, 0.64, 0.63, 0.65, 0.83, 0.83, 0.89, 
0.9, 0.94, 0.71, 0.79, 0.89, 0.89, 0.96, 0.45, 0.48, 0.31, 0.28, 
0.41, 0.14, 0.66, 0.61, 0.61, 0.63), `Mean bias` = c(4.81, 0.23, 
0.18, 0.18, -0.19, 0.45, -0.08, 0.36, 0.36, -0.03, 0.53, 0.32, 
-0.07, -0.09, -0.08, 1.63, 0.27, 5.12, 5.07, 4, 5.22, 0.25, 0.2, 
0.2, -0.2, 0.44, -0.09, 0.36, 0.36, -0.03, 0.58, 0.35, -0.07, 
-0.09, -0.08, 1.44, 0.58, 5.36, 5.32, 4.19), `Mean error` = c(4.82, 
0.33, 0.43, 0.43, 0.21, 0.54, 0.18, 0.43, 0.43, 0.15, 0.54, 0.34, 
0.1, 0.1, 0.09, 9.26, 7.14, 8.25, 8.22, 7.17, 5.22, 0.27, 0.4, 
0.4, 0.2, 0.44, 0.12, 0.39, 0.39, 0.07, 0.58, 0.35, 0.09, 0.1, 
0.08, 6, 3.63, 6.57, 6.52, 5.39), RMSE = c(0.37, 0.03, 0.05, 
0.05, 0.01, 0.04, 0.02, 0.04, 0.04, 0.01, 0.04, 0.02, 0.01, 0.01, 
0.01, 0.51, 0.37, 0.43, 0.43, 0.37, 1.37, 0.07, 0.16, 0.16, 0.04, 
0.11, 0.05, 0.12, 0.12, 0.02, 0.13, 0.08, 0.02, 0.02, 0.02, 1.32, 
0.79, 1.37, 1.36, 1.14), `Scatter Index` = c(1.1, 0.07, 0.13, 
0.13, 0.04, 0.17, 0.08, 0.17, 0.17, 0.05, 0.31, 0.18, 0.06, 0.06, 
0.06, 0.03, 0.02, 0.02, 0.02, 0.02, 3.89, 0.21, 0.44, 0.44, 0.12, 
0.46, 0.21, 0.53, 0.53, 0.08, 1.03, 0.61, 0.16, 0.17, 0.15, 0.07, 
0.04, 0.07, 0.07, 0.06)), row.names = c(NA, -40L), class = c("tbl_df", 
"tbl", "data.frame"))
 

Ответ №1:

Мы также можем сделать это без split ting, т. е. используя nest_by из dplyr

 library(dplyr)
library(stringr)
table_list %>%
    nest_by(compound) %>% 
    mutate(filename = file.path('output/final_plots/1. model performance', 
          str_c(compound, 'table_metrics.png')),
     new = save_kable(file = filename, bs_theme = "journal", 
      self_contained = TRUE, x = kbl(data, booktabs = TRUE,
            align = c('l','l', 'c')) %>%
            kable_styling))
 

-выход

введите описание изображения здесь

Ответ №2:

  • map не имеет доступа к именам фрейма данных, поэтому использование names(.) не будет работать. Вы можете использовать imap , который по умолчанию передает данные и имя.
  • group_split setNames можно объединить вместе за один шаг, если вы используете split .

Вы можете попробовать —

 library(dplyr)
library(purrr)
library(kableExtra)

table_list  %>%
  split(.$compound) %>%
  imap(~
    save_kable(file = paste0('output/final_plots/1. model performance/',.y,
                                'table_metrics.png'),
                  bs_theme = 'journal', 
                  self_contained = T, 
                  x = kbl(.x, booktabs = T, align = c('l','l', 'c')) %>%
                    kable_styling() 
                   )
    )