提问人:John J. 提问时间:9/18/2020 更新时间:9/18/2020 访问量:3980
如何根据 [gt] 表中的单元格值有条件地设置单元格的格式
How to conditionally format a cell in a [gt] table based on the value of the cell
问:
该软件包允许用户根据有关行的条件语句轻松设置单元格的格式。我正在寻找一种根据单元格中的值设置每个单元格格式的方法。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)
此函数以字符串形式返回每个值的相应颜色名称。
## 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
答:
6赞
akrun
9/18/2020
#1
首先创建对象,然后在循环中的行序列上循环,以在参数 in 取值 1 时着色gt
for
color
cell_fill
length
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")
评论
1赞
John J.
9/18/2020
@akrun,这太棒了。谢谢。我接受了你的回答,并将循环放入一个函数中。你介意我编辑你的答案以包含这个吗?那我就接受吧。for
1赞
emilliman5
1/21/2022
对函数进行一次修改,使其完全独立,从 .即column_fill
gtobj
gtobj$`_data`
0赞
akrun
11/9/2022
@fe108 请检查OP的代码
评论