将dataframe显示为HTML表,并基于另一列使用条件着色

将dataframe显示为HTML表,并基于另一列使用条件着色,r,R,我有一个数据帧(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 =

我有一个数据帧(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"))
        )
    
    库(dplyr)
    图书馆(DT)
    ##添加用于格式化的虚拟列
    mtcarsColor mtcars$vs~1,
    真~0
    )
    )
    )
    ##相关列索引
    
    dataCols可能会检查DT包:。查看此链接了解(有条件的)行和列样式:不幸的是,DT似乎没有在列之间进行比较的功能,而是使用一个常量…@doctshinds:解决方法是在用于格式化的数据中添加一组(隐藏的)列,请参见下面的答案这是一个绝妙的想法…我已经奋斗了好几天了!非常感谢你。为了学习,我将如何在htmlTable中使用上述方法?我试着使用:
    x我不太清楚“通过电子邮件发送html表,来自DT似乎非常大”是什么意思?您的意思是您正在通过电子邮件发送由
    DT::datatable
    生成的原始html吗?我想使用mailR包在电子邮件正文中插入由DT生成的html表,我认为由于DT table html代码带有搜索和其他设置,它不会显示在收件人的电子邮件正文中。但当我把它贴上时,它是可见的。如果我插入由htmlTable生成的表,则不会发生这种情况。这里的颜色是由简单的css和html代码是非常轻,因此,使邮寄我应该产生轻重量的html表。