【问题标题】:Gradient colored datatable rows in R ShinyR Shiny中的渐变彩色数据表行
【发布时间】:2016-11-10 20:40:25
【问题描述】:

我想知道我们是否可以在 R Shiny 中做到这一点 example

# using styleColorBar
datatable(df) %>% formatStyle(names(df),
  background = styleColorBar(range(df), 'lightblue'),
  backgroundSize = '98% 88%',
  backgroundRepeat = 'no-repeat',
  backgroundPosition = 'center')

但是对于正值和负值有两种颜色,而且如果我们可以这样做,负值将作为条形长度的绝对值

祝你有个美好的一天!

【问题讨论】:

    标签: r shiny dt


    【解决方案1】:

    您可以使用rowCallback手动完成

    如你所见

    sss=datatable(df) %>% formatStyle(names(df),
                                  background = styleColorBar(range(df), 'lightblue'),
                                  backgroundSize = '98% 88%',
                                  backgroundRepeat = 'no-repeat',
                                  backgroundPosition = 'center')
    
    
    sss$x$options$rowCallback
    

    为每一列生成:

    函数(行,数据){ var value=data[1];如果(值!==null) $(this.api().cell(行, 1).node()).css({'background':isNaN(parseFloat(value)) || value

    所以:

    1) 你需要计算范围变量:

    rr=range(df)[2]-range(df)[1]
    r1=range(df)[2]
    r0=range(df)[1]
    

    2) 比在rowCallback中使用它

      datatable(
      df,  
      options = list(
            rowCallback=JS(paste0("function(row, data) {",
                                  paste(lapply(1:ncol(df),function(i){
                                    paste0("var value=data[",i,"];
                                           if (value!==null){
                                           if(value<0){
                                           $(this.api().cell(row,",i,").node()).css({'background':isNaN(parseFloat(value)) || value <=",r0," ? '' : 'linear-gradient(90deg, transparent ' + (",r1," - value)/",rr," * 100 + '%, red ' + (",r1," - value)/",rr," * 100 + '%)','background-size':'98% 88%','background-repeat':'no-repeat','background-position':'center'});
                                           }else{
                                           $(this.api().cell(row,",i,").node()).css({'background':isNaN(parseFloat(value)) || value <=",r0," ? '' : 'linear-gradient(90deg, transparent ' + (",r1," - value)/",rr," * 100 + '%, lightblue ' + (",r1," - value)/",rr," * 100 + '%)','background-size':'98% 88%','background-repeat':'no-repeat','background-position':'center'});
                                           }
                                           } ") 
    }),collapse="\n"),
    "}"))
      )
    ) 
    

    我在这里硬编码颜色(红色和浅蓝色)

    结果

    如果你想要不同的正负长度,你需要不同的范围变量或使用abs\ Math.abs - 绝对值(JS中的var和范围)

    附言

    JS 中列的编号从 0 开始,因此如果您没有行名,则需要 lapply 中的 0:(ncol(df)-1) 以获得正确的结果

    更新

    绝对值的范围 -1 :1 和色阶

    df = as.data.frame(cbind(matrix(round(runif(50, -1, 1), 3), 10), sample(0:1, 10, TRUE)))
    
    
    rr=range(abs(df))[2]-range(abs(df))[1]
    r1=range(abs(df))[2]
    r0=range(abs(df))[1]
    
    
    
    datatable(
      df,  
      options = list(
            rowCallback=JS(paste0("function(row, data) {",
                                  paste(lapply(1:ncol(df),function(i){
                                    paste0("var value=Math.abs(data[",i,"]);
                                            var value2=data[",i,"];
                                           if (value!==null){
                                           if(value2<0){
                                           $(this.api().cell(row,",i,").node()).css({'background':isNaN(parseFloat(value)) || value <=",r0," ? '' : 'linear-gradient(90deg, transparent ' + (",r1," - value)/",rr," * 100 + '%, red ' + (",r1," - value)/",rr," * 100 + '%)','background-size':'98% 88%','background-repeat':'no-repeat','background-position':'center'});
                                           }else{
                                           $(this.api().cell(row,",i,").node()).css({'background':isNaN(parseFloat(value)) || value <=",r0," ? '' : 'linear-gradient(90deg, transparent ' + (",r1," - value)/",rr," * 100 + '%, lightblue ' + (",r1," - value)/",rr," * 100 + '%)','background-size':'98% 88%','background-repeat':'no-repeat','background-position':'center'});
                                           }
                                           } ") 
    }),collapse="\n"),
    "}"))
      )
    ) 
    

    【讨论】:

    • 我想知道你是否有一个想法,如果你有时间,是否可以渐变地缩放颜色。就像我的数据框将是 -1 和 1 之间的值一样,是否可以使 0.0 透明 -> 0.5 中透明红色 -> 1.0 全红色,但不是通过对值执行多个条件来实现连续缩放
    • 哦,抱歉没看到,是的,现在很完美,非常感谢!你让我开心:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-16
    • 2011-01-18
    • 1970-01-01
    • 1970-01-01
    • 2017-03-28
    • 2012-06-19
    • 2022-06-10
    相关资源
    最近更新 更多