【问题标题】:DT gets refreshed quickly if updateselectInput() is used如果使用 updateselectInput() 会快速刷新 DT
【发布时间】:2019-11-07 03:50:03
【问题描述】:

在闪亮的应用程序中,selectInput() 的选择会根据数据框 dfGrade 列的值进行更新.我需要根据 Grade 的唯一值显示一个 DT 表。

ui <- uiOutput('mainPage')


server <- function(input, output, session) {

  grade <- c("All",9,10,11,12)

  output$mainPage <- renderUI({
    fluidPage(

      selectInput(inputId = "grade",shiny::HTML
                  ("<span style='color: white'>Designation</span>"),
                  choices = grade),
      DTOutput('table')
    )
  })


  output$table <- renderDT({

    df <-  data.frame("Name" = c('Arun','Ram','Krishna','Rama','Ashwin'),
                      "Grade" = c(10,11,10,12,11),
                      "StressLevel" = c('Stressful','Very stressful','Very stressful','Stressful','Stressful'))

    df$Name<-as.character(df$Name)

    rownames(df) <- c()

    selectedGrade <- as.list(unique(df[,"Grade"]))

    updateSelectInput(session,inputId = "grade",
                      choices = c("All",selectedGrade))


    if(input$grade == "All"){

      dataSelected <- df[,c(1,3)]

      stressCount <- length(unique(dataSelected$StressLevel))
      if(stressCount == 2){
        color = c('#ff684c','#e03426')
      }else{
        color = c('#ff684c')
      }
      if(stressCount == 0){
        color = c()
      }



      datatable(dataSelected, options = list(pageLenth = 5, searching = FALSE,
                                             lengthMenu = c(5, 10, 15, 20),lengthChange = FALSE,
                                             scrollX = T, autoWidth = TRUE,
                                             initComplete = JS(
                                               "function(settings, json) {",
                                               "$(this.api().table().header()).css({ 
                                               'color': '#fff'});",
                                               "}")))%>% formatStyle(
                                                 'StressLevel',
                                                 Color = styleEqual(unique(dataSelected$StressLevel), 
                                                                    color))


  }else{

    dataSelected <- df %>% filter(Grade == input$grade)

    dataSelected <- dataSelected[,c(1,3)]

    stressCount <- length(unique(dataSelected$StressLevel))
    if(stressCount == 2){
      color = c('#ff684c','#e03426')
    }else{
      color = c('#ff684c')
    }

    if(stressCount == 0){
      color = c()
    }

    datatable(dataSelected, options = list(pageLenth = 5, searching = FALSE,
                                           lengthMenu = c(5, 10, 15, 20),lengthChange = FALSE,
                                           scrollX = T, autoWidth = TRUE,
                                           initComplete = JS(
                                             "function(settings, json) {",
                                             "$(this.api().table().header()).css({ 
                                             'color': '#fff'});",
                                             "}"))) %>% formatStyle(
                                               'StressLevel',
                                               Color = styleEqual(unique(dataSelected$StressLevel),color))     
}
})
}

shinyApp(ui = ui, server = server)

最初,数据表显示为选择 All 作为值。如果我选择其他选项,例如 10,DT 会显示与 10 年级相关的数据,但它会很快刷新。面临的后果是,除了All以外的等级数据都无法查看。

谁能为此问题提供合适的解决方案?

【问题讨论】:

    标签: r shiny dt


    【解决方案1】:

    您需要设置updateSelectInput()selected 参数以保留当前选择:

    library(shiny)
    library(DT)
    library(dplyr)
    
    ui <- uiOutput('mainPage')
    
    server <- function(input, output, session) {
      grade <- c("All", 9, 10, 11, 12)
    
      output$mainPage <- renderUI({
        fluidPage(selectInput(
          inputId = "grade",
          shiny::HTML
          ("<span style='color: white'>Designation</span>"),
          choices = grade
        ),
        DTOutput('table'))
      })
    
    
      output$table <- renderDT({
        DF <-
          data.frame(
            "Name" = c('Arun', 'Ram', 'Krishna', 'Rama', 'Ashwin'),
            "Grade" = c(10, 11, 10, 12, 11),
            "StressLevel" = c(
              'Stressful',
              'Very stressful',
              'Very stressful',
              'Stressful',
              'Stressful'
            )
          )
    
        DF$Name <- as.character(DF$Name)
    
        rownames(DF) <- c()
    
        selectedGrade <- as.list(unique(DF[, "Grade"]))
    
        updateSelectInput(
          session,
          inputId = "grade",
          choices = c("All", selectedGrade),
          selected = isolate({
            input$grade
          })
        )
    
    
        if (input$grade == "All") {
          dataSelected <- DF[, c(1, 3)]
    
          stressCount <- length(unique(dataSelected$StressLevel))
          if (stressCount == 2) {
            color = c('#ff684c', '#e03426')
          } else{
            color = c('#ff684c')
          }
          if (stressCount == 0) {
            color = c()
          }
    
    
    
          datatable(
            dataSelected,
            options = list(
              pageLenth = 5,
              searching = FALSE,
              lengthMenu = c(5, 10, 15, 20),
              lengthChange = FALSE,
              scrollX = T,
              autoWidth = TRUE,
              initComplete = JS(
                "function(settings, json) {",
                "$(this.api().table().header()).css({
                                                   'color': '#fff'});",
                "}"
              )
            )
          ) %>% formatStyle('StressLevel',
                            Color = styleEqual(unique(dataSelected$StressLevel),
                                               color))
    
    
        } else{
          dataSelected <- DF %>% filter(Grade == input$grade)
    
          dataSelected <- dataSelected[, c(1, 3)]
    
          stressCount <- length(unique(dataSelected$StressLevel))
          if (stressCount == 2) {
            color = c('#ff684c', '#e03426')
          } else{
            color = c('#ff684c')
          }
    
          if (stressCount == 0) {
            color = c()
          }
    
          datatable(
            dataSelected,
            options = list(
              pageLenth = 5,
              searching = FALSE,
              lengthMenu = c(5, 10, 15, 20),
              lengthChange = FALSE,
              scrollX = T,
              autoWidth = TRUE,
              initComplete = JS(
                "function(settings, json) {",
                "$(this.api().table().header()).css({
                                                 'color': '#fff'});",
                "}"
              )
            )
          ) %>% formatStyle('StressLevel',
                            Color = styleEqual(unique(dataSelected$StressLevel), color))
        }
      }, server = FALSE)
    }
    
    shinyApp(ui = ui, server = server)
    

    此外,我将server = FALSE 设置为renderDT(),以防止在重新渲染数据表时闪烁“处理中...”消息。

    【讨论】:

      猜你喜欢
      • 2015-11-01
      • 2016-07-20
      • 1970-01-01
      • 1970-01-01
      • 2019-04-28
      • 1970-01-01
      • 2015-06-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多