我有一个数据框(mtcars)。它的列名称为: mpg cyl disp hp drat wt qsec vs 我想将每一列与 vs(第 1 列与第 8 列、第 2 列与第 8 列等)进行比较,并将 1:7 中的每一列着色为红色(如果元素小于第 8 列中的元素)、黄色(如果等于)或绿色(如果更大)。
我使用了 KableExtra 包并使用了以下代码:
library(dplyr)
library(kableExtra)
mtcars %>%
mutate(
car = row.names(.),
mpg = cell_spec(mpg, "html", background = ifelse(mpg > vs, "green", "red")),
cyl = cell_spec(cyl, "html", background = ifelse(cyl > vs,"green", "red" )),
) %>%
kable(format = "html", escape = F) %>%
kable_styling("striped", full_width = F)
我可以以某种方式实现,但有两个主要问题:
KableExtra 不会生成单元格背景作为 Html 中的平铺/填充,它只是突出显示单元格中的文本。我看到乳胶可以产生细胞背景,但我不能使用乳胶,只需要 html 解决方案。
在我的实际数据框中有 70 个动态列,因此需要访问没有名称的列。
也尝试过 condformat 和 tableHTML...但无法实现动态比较列。
通过 DT 包使用列样式的一种可能方法是添加一组虚拟列,用于在
formatStyle
中设置背景颜色:
library(dplyr)
library(DT)
## add dummy columns for formatting
mtcarsColor <- mutate_all(mtcars, list(color = ~case_when(
. < mtcars$vs ~ -1,
. > mtcars$vs ~ 1,
TRUE ~ 0
)
)
)
## relevant column indices
dataCols <- grep("color", names(mtcarsColor), invert = TRUE)
colorCols <- grep("color", names(mtcarsColor))
## datatable formatted by (hidden) dummy columns
datatable(mtcarsColor,
rownames = FALSE,
options = list(columnDefs = list(list(visible = FALSE, targets = colorCols - 1)))
) %>%
formatStyle(columns = dataCols,
valueColumns = colorCols,
backgroundColor = styleEqual(c("-1", "0", "1"), c("#FF000080", "#FFFF0080", "#00FF0080"))
)
DT 包有一个巧妙的方法来做到这一点。您使用一列为另一列着色,然后隐藏第一列。 https://rstudio.github.io/DT/010-style.html