【问题标题】:How to change the cell color of a cell of an R Shiny data table dependent on it's value?如何根据其值更改 R Shiny 数据表的单元格的单元格颜色?
【发布时间】:2018-09-13 03:42:45
【问题描述】:

我正在尝试根据其值更改 R Shiny 数据表的单元格的单元格颜色。例如,我创建了以下应用程序:

# ui.R

fluidPage(
  # Outputting data table.
  DT::dataTableOutput("table")
)

# server.R

library(DT)

data(iris)

function(input, output) {

  # Rendering data table.
  output$table <- DT::renderDataTable({
    head(iris)
  },
  options = list(dom = "t",
                 ordering = FALSE))

}

以下是上述代码生成的 HTML 骨架和结果页面:

例如,假设我希望所有包含整数的单元格都涂成红色。有选择地,我只想为第 2 行第 2 列和第 5 行第 1 列的单元格着色,其中值分别为 3 和 5。这在 R Shiny 中可行吗?

我目前的解决方法是在服务器端设置单个单元格的类,然后使用 CSS 为它们着色。但是,我找不到这样做的方法。

【问题讨论】:

    标签: r html-table shiny


    【解决方案1】:

    这个页面有一堆格式化DT数据表的技巧:https://rstudio.github.io/DT/010-style.html

    对于您的具体问题,formatStyle 功能可让您根据表格中的特定值设置美学:

    library(DT)
    options(DT.options = list(pageLength = 5))
    df = as.data.frame(cbind(matrix(round(rnorm(50), 3), 10), sample(0:1, 10, TRUE)))
    
    # style V6 based on values of V6
    datatable(df) %>% formatStyle(
        'V6',
        backgroundColor = styleEqual(c(0, 1), c('gray', 'yellow'))
    )
    
    # style V1 based on values of V6
    datatable(df) %>% formatStyle(
        'V1', 'V6',
        backgroundColor = styleEqual(c(0, 1), c('gray', 'yellow'))
    )
    

    【讨论】:

      【解决方案2】:

      这里有两个想法:

      我希望所有包含整数的单元格都涂成红色

      (1) 使用 Javascript 标记整数:

      library(DT)
      df <- head(iris)
      df %>% 
        datatable %>% 
        formatStyle(1:4, color = JS("value % 1 === 0 ? 'red' : ''"))
      

      有选择地,我只想为第 2 行第 2 列的单元格着色,并且 第 5 行第 1 列

      (2) 使用隐藏值列标记单元格:

      m <- matrix(F, ncol = ncol(df)-1, nrow = nrow(df))
      m[rbind(c(2,2),c(5,1))] <- TRUE
      df %>% 
        cbind(m) %>% 
        datatable(
          options=list(columnDefs = list(list(visible=FALSE, targets=1:4+ncol(df)))),
        ) %>% 
        formatStyle(
          columns = 1:4, 
          valueColumns = 1:4+ncol(df), 
          color = styleEqual(c(1,0), c("red", "black"))
        )
      

      我从 Shiny 中抽象出来,因为这似乎是一个数据表问题。此外,可能还有更好的选择。

      【讨论】:

      • 对于 Javascript 解决方案,是否可以根据不同的指标为其他单元格着色?例如,如果除了之前的红色颜色之外,我还想用绿色字母将所有单元格着色怎么办?
      • @michaelmccarthy404 当然可以,例如df[1,1] &lt;- "a";df %&gt;% datatable %&gt;% formatStyle(1:4, color = JS("value % 1 === 0 ? 'red' : String(value).match(/[A-z]+/) ? 'green' : ''"))?
      猜你喜欢
      • 2021-10-08
      • 1970-01-01
      • 2023-03-14
      • 2017-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-13
      • 2021-01-10
      相关资源
      最近更新 更多