如何根据 [gt] 表中的单元格值有条件地设置单元格的格式

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

提问人:John J. 提问时间:9/18/2020 更新时间:9/18/2020 访问量:3980

问:

该软件包允许用户根据有关行的条件语句轻松设置单元格的格式。我正在寻找一种根据单元格中的值设置每个单元格格式的方法。gt

这就是我的意思。在下表中,我想用标准普尔值按其包含的值为每个单元格着色。

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)

basic gt table

此函数以字符串形式返回每个值的相应颜色名称。

## 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)))

gt with filled cell

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

R GT型

评论


答:

6赞 akrun 9/18/2020 #1

首先创建对象,然后在循环中的行序列上循环,以在参数 in 取值 1 时着色gtforcolorcell_filllength

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

-输出

enter image description here

编辑: 然后可以将此循环放置在这样的函数中。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")

gt table with all columns filled

评论

1赞 John J. 9/18/2020
@akrun,这太棒了。谢谢。我接受了你的回答,并将循环放入一个函数中。你介意我编辑你的答案以包含这个吗?那我就接受吧。for
1赞 emilliman5 1/21/2022
对函数进行一次修改,使其完全独立,从 .即column_fillgtobjgtobj$`_data`
0赞 akrun 11/9/2022
@fe108 请检查OP的代码