【问题标题】:R shiny: color cell background based on Lab color spaceR 闪亮:基于 Lab 颜色空间的颜色单元格背景
【发布时间】:2016-01-15 14:19:17
【问题描述】:

我有一个包含 Lab 颜色空间值的数据框。这是一个例子:

L*     a*     b*       color
80     25     -30       NA
75     55     55        NA
30     0      25        NA
10     -20    30        NA
55     15     20        NA
60     43     18        NA
...  ...

这里有 1000 多条记录。我想根据 L*,a*,b* 列中的 Lab 颜色空间值对列颜色中的单元格进行着色。我没有 Jquery 的背景。我在这里找到了一个示例:R Shiny: table conditional formatting within renderUI 但我不知道如何修改 Jquery 脚本。任何人都可以帮助我吗?谢谢!

【问题讨论】:

    标签: jquery css r shiny lab-color-space


    【解决方案1】:

    如果您改为使用 rgb 颜色空间着色,您可以这样做:

    library(shiny)
    
    color.min <- 0
    color.max <- 250
    n <- 100
    
    # Simulate data
    random.data <- data.frame("l"=runif(n,min=color.min,max=color.max),
                              "a"=runif(n,min=color.min,max=color.max),
                              "b"=runif(n,min=color.min,max=color.max),
                              "color"=rep(NA,n))
    
    server <- shinyServer(function(input, output, session) {
    
      observe({
        output$table <- renderTable({
          random.data
        })
      })
    })
    
    
    ui <- shinyUI(fluidPage(
      # Add jQuery script
      tags$head(
        tags$script(
          HTML("
              function color(){
                if(document.querySelector('#table')!=null){
                  // Select each table row in an array and loop over that with jQuery each
                  $('#table > table > tbody').find('tr').each(function(index, value) { 
                    // Get values for rgb and round to integers
                    var vals = [];
                    $(this).children('td').slice(1, 4).each(function(index, value) { 
                      vals[index] = parseInt( $(this).html() );
                    });
                    // Color 5:th child the selected rgb color
                    $(':nth-child(5)',this).css('background','rgb('+String(vals[0])+','+String(vals[1])+','+String(vals[2])+')');
                  })
                }
                else{
                  setTimeout(function() { color(); }, 100);
                }
              }
              color();
               ")
        )
      ),
      fluidRow(
        column(10, uiOutput("table")),
        column(2,actionButton("color","color"))
      )
    ))
    
    shinyApp(ui = ui, server = server)
    

    【讨论】:

    • 您的回答非常有用。我还有一个问题。你知道如何去掉那个颜色按钮吗?那么单元格背景可以自动显示吗?非常感谢你!
    • 当然,在页面加载时运行代码。我将编辑我的答案以展示如何做到这一点
    • 好吧,我不得不采用不同的解决方案,但基本上我每 0.1 秒检查一次是否存在具有 id 表的元素,如果存在,它会运行着色部分。它不是很优雅,但很有效。
    • 这是我真正在寻找的一个了不起的答案。太感谢了。如果我还有其他问题,我会问你。非常感谢您的帮助。
    • 太棒了!当然,请告诉我
    猜你喜欢
    • 2018-07-14
    • 2017-12-24
    • 1970-01-01
    • 2018-11-20
    • 2016-07-25
    • 2017-06-19
    • 2016-02-18
    • 2014-08-18
    • 1970-01-01
    相关资源
    最近更新 更多