将dataframe显示为HTML表,并基于另一列使用条件着色
我有一个数据帧(mtcars)。其列的名称为:mpg cyl disp hp drat wt qsec vs 我想将每列与vs(第1列与第8列、第2列与第8列等)进行比较,并将每列从1:7涂成红色(如果元素小于第8列中的元素)、黄色(如果相等)或绿色(如果更大) 我使用了KableExtra软件包,并使用了以下代码:将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 =
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)
我可以以某种方式实现,但有两个主要问题:
也尝试了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表。