DT::formatStyle可根据原始HTML的字符向量设置数据表行的背景颜色
我试图基于原始HTML的向量设置datatables行的背景颜色(我做而不是转义,以便它呈现上标)。在这一点上,我可以做一个或另一个:通过转义HTML来正确设置背景颜色,或者通过不转义HTML来正确设置上标,但不能同时进行二者 我们可以使用DT::formatStyle可根据原始HTML的字符向量设置数据表行的背景颜色,r,datatables,dt,R,Datatables,Dt,我试图基于原始HTML的向量设置datatables行的背景颜色(我做而不是转义,以便它呈现上标)。在这一点上,我可以做一个或另一个:通过转义HTML来正确设置背景颜色,或者通过不转义HTML来正确设置上标,但不能同时进行二者 我们可以使用DT::formatStyle和DT::styleEqual根据表中的变量设置数据表特定行的背景色;例如,当V1=='Crackers'时,将背景设置为灰色: library(DT) df <- data.frame( V1 = c('Chee
DT::formatStyle
和DT::styleEqual
根据表中的变量设置数据表特定行的背景色;例如,当V1=='Crackers'
时,将背景设置为灰色:
library(DT)
df <- data.frame(
V1 = c('Cheese<sup>1</sup>', 'Crackers', 'Taters'),
v2 = c(10, 4, 7))
datatable(df, escape = FALSE) %>%
formatStyle('V1',
target = 'row',
backgroundColor = styleEqual(
levels = 'Crackers',
values = 'gray'))
问题可能是styleEqual
在levels
参数上调用htmltools::htmlEscape
,即
htmltools::htmlEscape('Cheese<sup>1</sup>')
[1] "Cheese<sup>1</sup>"
有没有更好的方法在不修改源代码的情况下实现这一点?有趣的问题。我发现了一个技巧:在
levels
参数中使用列表而不是字符向量
datatable(df, escape = FALSE) %>%
formatStyle('V1',
target = 'row',
backgroundColor = styleEqual(
levels = list('Cheese<sup>1</sup>', 'Crackers'),
values = c('gray', 'gray')))
datatable(df,escape=FALSE)%>%
formatStyle('V1',
目标='行',
backgroundColor=styleEqual(
级别=列表('Cheese1','Crackers'),
值=c('灰色','灰色'))
通过这种方式,
是.character(levels)
和是.factor(levels)
都是FALSE
我喜欢你的想法!谢谢:)
styleEqual2 <- function (levels, values, default = NULL, escape = TRUE)
{
n = length(levels)
if (n != length(values))
stop("length(levels) must be equal to length(values)")
if (!is.null(default) && (!is.character(default) || length(default) !=
1))
stop("default must be null or a string")
if (n == 0)
return("''")
if ((is.character(levels) || is.factor(levels)) && escape)
levels = htmltools::htmlEscape(levels)
levels = DT:::jsValues(levels)
values = DT:::jsValues(values)
js = ""
for (i in seq_len(n)) {
js = paste0(js, sprintf("value == %s ? %s : ",
levels[i], values[i]))
}
default = if (is.null(default))
"null"
else DT:::jsValues(default)
JS(paste0(js, default))
}
datatable(df, escape = FALSE) %>%
formatStyle('V1',
target = 'row',
backgroundColor = styleEqual2(
levels = c('Cheese<sup>1</sup>', 'Crackers'),
values = c('gray', 'gray'),
escape = FALSE))
datatable(df, escape = FALSE) %>%
formatStyle('V1',
target = 'row',
backgroundColor = styleEqual(
levels = list('Cheese<sup>1</sup>', 'Crackers'),
values = c('gray', 'gray')))