将数据框显示为 HTML 表格,并基于另一列进行条件着色

问题描述 投票:0回答:2

我有一个数据框(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)

我可以以某种方式实现,但有两个主要问题:

  1. KableExtra 不会生成单元格背景作为 Html 中的平铺/填充,它只是突出显示单元格中的文本。我看到乳胶可以产生细胞背景,但我不能使用乳胶,只需要 html 解决方案。

  2. 在我的实际数据框中有 70 个动态列,因此需要访问没有名称的列。

也尝试过 condformat 和 tableHTML...但无法实现动态比较列。

r
2个回答
1
投票

通过 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"))
    )


0
投票

DT 包有一个巧妙的方法来做到这一点。您使用一列为另一列着色,然后隐藏第一列。 https://rstudio.github.io/DT/010-style.html

© www.soinside.com 2019 - 2024. All rights reserved.