conditional style of gt summary row in R

Viewed 120

I have the following table.

I would like to put yellow highlight only in the cells in the "my_sum" row when the value is greater than 0. How can I do this for grouped data? I assume some type of function to recognize the grouping in the data put into the tab_style?

Here is my reprex

library(gt)  
library(tidyverse)

tibble(cars = c("honda", "honda", 
                "ford", "ford"), 
       mpg = c(24, 22, 
               NA, NA), 
       wt = c(NA, NA, 
              3432, 4234)
       ) %>%
          group_by(cars) %>%
          gt() %>%
          fmt_missing(columns = everything(),
                      missing_text = "") %>%
          summary_rows(
                    groups = TRUE,
                    columns = c(mpg:wt),
                    fns = list("my_sum" = ~sum(., na.rm = TRUE)),
                    missing_text = "",
                    formatter = fmt_number, 
                    decimals = 0
          ) %>%
          grand_summary_rows(
                    columns = c(mpg:wt),
                    fns = list("my_big_sum" = ~sum(., na.rm = TRUE)),
                    missing_text = "",
                    formatter = fmt_number, 
                    decimals = 0
          ) %>%
          tab_options(
                    row_group.font.weight = "bold"
          ) %>%
          tab_style(
                    style = list(
                              cell_fill(color = "#d4ebf2")
                    ),
                    locations = cells_grand_summary(
                              columns = c("mpg", "wt")
                    )
          ) %>%
          tab_style(
                    style = list(
                              cell_fill(color = "#FFFFE0")
                    ),
                    locations = cells_summary(
                              columns = c("mpg", "wt")
                    )
          )
1 Answers

this answer is a bit hacky and manual but it works. first you save your table as an object. then you can directly access the table styles and manually modify them.

library(gt)  
library(tidyverse)

tibble(cars = c("honda", "honda", 
                "ford", "ford"), 
       mpg = c(24, 22, 
               NA, NA), 
       wt = c(NA, NA, 
              3432, 4234)
) %>%
  group_by(cars) %>%
  gt() %>%
  fmt_missing(columns = everything(),
              missing_text = "") %>%
  summary_rows(
    groups = TRUE,
    columns = c(mpg:wt),
    fns = list("my_sum" = ~sum(., na.rm = TRUE)),
    missing_text = "",
    formatter = fmt_number, 
    decimals = 0  ) %>%
  grand_summary_rows(
    columns = c(mpg:wt),
    fns = list("my_big_sum" = ~sum(., na.rm = TRUE)),
    missing_text = "",
    formatter = fmt_number, 
    decimals = 0
  ) %>%
  tab_options(
    row_group.font.weight = "bold"
  ) %>%
  tab_style(
    style = list(
      cell_fill(color = "#d4ebf2")
    ),
    locations = cells_grand_summary(
      columns = c("mpg", "wt")
    )
  ) %>%
  tab_style(
    style = list(
      cell_fill(color = "#FFFFE0")
    ),
    locations = cells_summary(
      columns = c("mpg", "wt"),
    rows = "my_sum" )
  ) -> t1


x1 <- t1$`_styles`$styles[4]

x2 <- t1$`_styles`$styles[3]
x2[[1]]$cell_fill$color <- "#FFFFFF"

t1$`_styles`$styles[3] <- x1
t1$`_styles`$styles[4] <- x2

t1$`_styles`$styles[6] <- x1
t1$`_styles`$styles[5] <- x2
Related