如何根据单元格的值有条件地格式化 [gt] table 中的单元格

How to conditionally format a cell in a [gt] table based on the value of the cell

gt 包让用户可以轻松地格式化关于行的单元格 based on conditional statements。我正在寻找一种根据单元格中的值格式化每个单元格的方法。

这就是我的意思。在下面的 table 中,我想用 S&P 值根据它包含的值为每个单元格着色。

library(gt)
library(dplyr)
library(tidyr)

# some arbitrary values of the S&P 500
jan08 <- sp500 %>% 
  filter(between(date, as.Date("2008-01-01"), as.Date("2008-01-15"))) %>%
  select(date, open, high, low, close)

gt(jan08)

此函数returns将每个值的适当颜色名称作为字符串。

## this is the range of values
sp500.range <- jan08 %>% pivot_longer(cols = c(open, high, low, close))
heat_palette <- leaflet::colorNumeric(palette = "YlOrRd",
                                      domain = sp500.range$value)

# For example:
> heat_palette(1411.88)
[1] "#FEB852"

每个单元格都可以手动着色,但这显然不实用。

gt(jan08) %>%
  tab_style(style = cell_fill(color = heat_palette(1411.88)),
            locations = cells_body(columns = "open", 
                                   rows = (open == 1411.88)))

有没有办法使用tab_style函数根据单元格的值有条件地填充单元格?

首先创建 gt 对象,然后在 for 循环中遍历行序列以着色,因为 cell_fill 中的 color 参数取值为length 1

library(gt)
gtobj <- gt(jan08)
ht_values <- heat_palette(jan08$open)
for(i in seq_along(jan08$open)) {
   gtobj <- gtobj %>%
         tab_style(style = cell_fill(color = ht_values[i]),
                   locations = cells_body(columns = "open", rows = i))
}



gtobj

-输出

编辑: 然后可以将此 for 循环放在这样的函数中。

fill_column <- function(gtobj, column){
  ht_values <- heat_palette(jan08 %>% pull(sym(column)))
  for(i in seq_along(jan08 %>% pull(sym(column)))){
    gtobj <- gtobj %>%
      tab_style(style = cell_fill(color = ht_values[i]),
                locations = cells_body(columns = column, rows = i))
  }
  gtobj
}

然后,这个函数可以包含在管道中。

gt(jan08) %>%
  fill_column("open") %>%
  fill_column("high") %>%
  fill_column("low") %>%
  fill_column("close")