DT::formatStyle可根据原始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

我试图基于原始HTML的向量设置datatables行的背景颜色(我做而不是转义,以便它呈现上标)。在这一点上,我可以做一个或另一个:通过转义HTML来正确设置背景颜色,或者通过不转义HTML来正确设置上标,但不能同时进行二者

我们可以使用
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&lt;sup&gt;1&lt;/sup&gt;"

有没有更好的方法在不修改源代码的情况下实现这一点?

有趣的问题。我发现了一个技巧:在
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')))