如何根据单元格的值有条件地格式化 [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")
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")