簡體   English   中英

RShiny中表的條件格式化

[英]Conditional formatting of a table in RShiny

我正在嘗試對隊列分析進行可視化,並希望在閃亮中使用RenderDataTable來獲得這種可視化,我可以基於具有值1/0的單獨列突出顯示所有單元格,其中1為陰影並且0沒有被遮擋。

隊列表

我嘗試了幾件事,包括嘗試在geom_tile中使用ggplot2 ,但它無濟於事。 我也試過看rpivotTable ,但我無法弄清楚如何遮蔽某些細胞。

示例數據:

df <- "
cohort  wk  value   flag
1   1   24  0
1   2   12  0
1   3   10  0
1   4   5   0
1   5   2   0
2   1   75  0
2   2   43  1
2   3   11  0
2   4   14  0
3   1   97  0
3   2   35  0
3   3   12  1
4   1   9   0
4   2   4   0
5   1   5   0"

df <- read.table(text = df, header = TRUE)

使用DT-package

#global.R

library(shiny)
library(DT)

sketch = htmltools::withTags(table(
  class = 'display',
    thead(
       tr(
         th(rowspan = 2, ''),
         th(rowspan = 2, 'Cohort'),
         th(colspan = 10, 'Wk')
       ),
       tr(lapply(paste(c('', 'f'), rep(1:5, each=2), sep=''), th))
    )
))

#ui.R

shinyUI( fluidPage( DT::dataTableOutput(outputId="table") ) )

#server.R

shinyServer(function(input, output, session) {
    output$table <- DT::renderDataTable({
        df$flag <- as.factor(df$flag)
        x <-  reshape(df, timevar = 'wk', sep = '_', direction = 'wide',idvar ='cohort')
        row.names(x) <- NULL
        colnames(x)[-1] <- paste(c('', 'f'), rep(1:5, each = 2), sep = '')
        datatable(x, rownames = T, container = sketch,
          options = list(dom = 'C<"clear">rti', pageLength = -1,
                         columnDefs = list(list(visible = F, targets = c(3,5,7,9,11))))
    )%>%
       formatStyle('1', 'f1', backgroundColor = styleEqual(c(0, 1), c('white','lightblue'))) %>%
       formatStyle('2', 'f2', backgroundColor = styleEqual(c(0, 1), c('white','lightblue'))) %>%
       formatStyle('3', 'f3', backgroundColor = styleEqual(c(0, 1), c('white','lightblue'))) %>%
       formatStyle('4', 'f4', backgroundColor = styleEqual(c(0, 1), c('white','lightblue'))) %>%
       formatStyle('5', 'f5', backgroundColor = styleEqual(c(0, 1), c('white','lightblue'))) 
    })  
})  

\\

在此輸入圖像描述

如果你想為DataTable着色你可以這樣做:

require(plyr)

# Create matrix
m.val <- max(unlist(lapply(unique(df$cohort),function(ch){ length(which(df$cohort==ch)) })))
cohort.df <-  do.call(rbind, lapply(unique(df$cohort),function(ch){ 
  v <- df$value[which(df$cohort==ch)]
  c(v,rep(NA,m.val-length(v))) 
  }))

ui <- fluidPage(
  tags$head(
    tags$script(
      HTML("
        Shiny.addCustomMessageHandler ('colorTbl',function (message) {
          console.log(message.row);
          var row = parseInt(message.row); var col = parseInt(message.col);
          $('#tbl').find('tbody').find('tr').eq(row).find('td').eq(col).css('background',message.color);
        });
           ")
    )
  ),
  dataTableOutput("tbl")
)

color <- "#6CAEC4"
server <- function(input, output, session) {
  colorTbl <- function(){
    # Get rows we want to color
    sel.d <- df[df$flag==1,]
    for(i in 1:nrow(sel.d)){
      row <- as.numeric(sel.d[i,sel.d$cohort]) -1
      col <- as.numeric(sel.d[i,sel.d$wk]) - 1
      session$sendCustomMessage(type = 'colorTbl', message = list(row=row,col=col,color=color))
    }
  }

  output$tbl <- renderDataTable({
    # Wait until table is rendered, then color
    reactiveTimer(200,{colorTbl()})
    as.data.frame(cohort.df)
  })
}

runApp(shinyApp(ui,server))

在這里,我使用jQuery根據您的標准為行着色。

這應該可以讓您開始使用ggplot2創建繪圖:

library(ggplot2)

ggplot(df, aes(x = wk, y = cohort, fill = factor(flag))) + 
  geom_tile(color = "white") +
  geom_text(aes(label = value), color = "white") +
  scale_y_reverse()

隊列情節

以閃亮的方式渲染繪圖應該是微不足道的,因為您沒有提供任何閃亮的代碼(例如服務器或ui),所以很難說您可能遇到問題的位置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM