根据不同数据集中的值格式化闪亮数据表 (DT) 的颜色

Posted

技术标签:

【中文标题】根据不同数据集中的值格式化闪亮数据表 (DT) 的颜色【英文标题】:Format color of shiny datatable (DT) according to values in a different dataset 【发布时间】:2017-07-22 23:57:28 【问题描述】:

我正在尝试根据上表中的值格式化 DT。 例如,我想显示某事 增加、减少或保持不变。 我可以用 kable 做到这一点,但是 无法进行下一步,我想单击单元格并显示所有相关数据 到另一个 DT 中的那个值。

library(shiny)
library(DT)
library(dplyr)
ui <- fluidPage(
    mainPanel(
      dataTableOutput("iris_head")
  )
)

server <- function(input, output) 

  #df_data <- iris

  df_data <- head(iris[-5])

  # Just a dataset describing if iris has changed over a month
  # If reference data is of the same size as the original data (df_data). 
  # If reference data is negative I want the cell in the df_data to be green; 
  # If zero blue and if positive then green.
  # I can make changes with ranges within the current range, can we get the color encoding from another table?
  # set the seed
  set.seed(42)
  reference_df <-  (sapply(df_data, function(x) jitter(x, amount = 2)) - df_data) %>% 
    round(. , digits = 0) 

  print(reference_df)


  output$iris_head <- renderDataTable(datatable(df_data, selection = "single" )%>%
                                        formatStyle('Sepal.Width',
                                                    color = styleInterval(c(3.4, 3.8), c('green', 'blue', 'red')),
                                                    backgroundColor = styleInterval(3.4, c('gray', 'yellow'))) %>%
                                        formatString('Sepal.Width', suffix = '<font color="red">&uArr; </font>'))




shinyApp(ui = ui, server = server)

本例中的reference_df 是:

Sepal.Length Sepal.Width Petal.Length Petal.Width
        2           1            2           0
        2          -1           -1           0
       -1           1            0           2
        1           1            2          -1
        1           0            2           2
        0           1           -2           2

所需的输出如图所示,我还想根据 reference_df 中的值对文本和背景进行着色(如果可能)。

【问题讨论】:

【参考方案1】:

对于文本颜色部分,您可以使用formatStyle,但您需要cbind df_datareference_df,然后将其传递给datatable 并将第 1 列的样式更改为第 4 列基于第 5 到 8 列的值:

datatable(cbind(df_data,reference_df), selection = "single",
                                                options=list(columnDefs = list(list(visible=FALSE, targets=c(5:8)))))%>%
                                        formatStyle(1:4, valueColumns=5:8,
                                                    color = JS("value < 0 ? 'red' : value > 0 ? 'green' : 'blue'"))

columnDefs 部分隐藏了最后 4 列。

你不能 formatString 基于值,所以如果你想添加箭头,你可以修改 df_data 以添加颜色和箭头,然后再将其传递给 datatable

  for(col in 1:dim(df_data)[2])
    df_data[col] <- mapply(function(i,j)
      ifelse(i > 0, paste0("<span style='color:red'>",j,"<font>&uArr; </font></span>"),
             ifelse(i<0, paste0("<span style='color:green'>",j,"<font>&dArr; </font></span>"),
                    paste0("<span style='color:blue'>",j,"<font>&hArr; </font></span>")))
    ,reference_df[col],df_data[col])
  

  output$iris_head <- renderDataTable(
    datatable(df_data, selection = "single",escape = F)
    )

这循环遍历df_data 的值,并根据reference_df 的值更改它们。您需要 escape=F 作为 datatable 调用中的参数以防止 html 转义。

如果您想为背景等着色,您可以在span 标签中添加更多 CSS 样式。

【讨论】:

谢谢!一个很好解释的答案。考虑到它得到了如此好的答案,有人在没有评论的情况下对这个问题投了反对票,这有点奇怪。

以上是关于根据不同数据集中的值格式化闪亮数据表 (DT) 的颜色的主要内容,如果未能解决你的问题,请参考以下文章

在 DT 表中的一行中嵌入闪亮的小部件

在闪亮应用程序的 DT::datatable 中添加、删除和编辑行

根据可编辑单元格用户输入更新闪亮的 DT

根据 tabPanel 选择从数据库获取数据。闪亮

为 DT 数据表上的双击事件创建 R 闪亮绑定

R闪亮的动态DT数据表记住过滤器/排序