【问题标题】:selectInput not showing the choices and resetting values to 'All' in shinyAppselectInput 不显示选项并将值重置为 shinyApp 中的“全部”
【发布时间】:2019-06-14 06:27:48
【问题描述】:

我正在 mtcars 数据上构建一个 shinyApp。我在 selectInput 按钮 中遇到问题。当我单击左侧的 disp 按钮 时,我没有选择。我只得到全部。 同样,当我将一些值放入 carb 过滤器,然后从 vs filter 中选择另一个值时,carb 和 disp 立即重置为“All”不应该发生。 carb 和 disp 中先前选择的值如果存在于 vs 选择值中,则应保留。 有人可以看看我的代码。我将不胜感激。

library(readr)  
library(shiny)   
library(DT)     
library(dplyr) 
library(shinythemes) 
library(htmlwidgets) 
library(shinyWidgets) 
library(shinydashboard)


data_table<-mtcars


#ui
ui = fluidPage( 
  sidebarLayout(
    sidebarPanel (



      uiOutput("vs_selector"),
      uiOutput("carb_selector"),
      uiOutput("disp_selector")),


    mainPanel(


      DT::dataTableOutput('mytable') )))




#server
server = function(input, output, session) {

  output$vs_selector <- renderUI({


    selectInput(inputId = "vs",
                label = "vs:", multiple = TRUE,
                choices = c( unique(data_table$vs)),
                selected = c(0,1))

  })



  output$carb_selector <- renderUI({

    available0 <- data_table[c(data_table$vs %in% input$vs ), "carb"]  


    selectInput(
      inputId = "carb", 
      label = "carb:",
      multiple = TRUE,
      choices = c('All',as.character(unique(available0))),
      selected = 'All')

  })



  output$disp_selector <- renderUI({

    available <- data_table[c(data_table$carb %in% input$carb    &    
data_table$vs %in% input$vs), "disp"]

    selectInput(
      inputId = "disp", 
      label = "disp:",
      multiple = TRUE,
      choices = c('All',as.character(unique(available))),
      selected = 'All')

  })



  thedata <- reactive({


    data_table<-data_table[data_table$vs %in% input$vs,]


    if(input$carb != 'All'){
      data_table<-data_table[data_table$carb %in% input$carb,]
    }


    if(input$disp != 'All'){
      data_table<-data_table[data_table$disp %in% input$disp,]
    }


    data_table

  })


  output$mytable = DT::renderDataTable({

    DT::datatable( {     

                     thedata()   # Call reactive thedata()


                   })

  })}  

shinyApp(ui = ui, server = server)

【问题讨论】:

  • 这里的问题在于selectInput 中的selected 参数。例如,在 carb, disp 选择器中,vs 选择器的每次更改都会将剩余的选择器重置为 All,因为这些选择器中的选项列表依赖于从 vs 选择器中选择的值。
  • 在 vs 选择器中,提及selected = c('1','2') 没有意义,原因有两个。首先,c( unique(as.character(data_table$vs))) 将为您提供 (0, 1),因此您不能将其设置为 (1,2)。其次,唯一值不是使用引号的字符串/字符数据类型
  • 非常感谢伙计,我做了这些更改并更新了我的代码。但我仍然有同样的问题。你能看看吗
  • 你想要逐步过滤 - 比如先 vs 然后 carb 然后 disp? disp 也是一个数值,为什么要为它提供一个下拉列表?
  • 是的,我想要一步一步的过滤器。它只是一个虚拟数据,我的原始数据有不同的变量,这就是我把 disp 放在这里的原因。如果需要,您可以放置​​任何其他变量而不是 disp

标签: r input shiny shinydashboard dt


【解决方案1】:

我对您的代码做了几处修改。特别是,我添加了一些req 的(参见?req),并在output$disp_selector 中修改了available

available <- data_table[["disp"]][data_table$vs %in% input$vs]
if(! "All" %in% input$carb){
  available <- available[data_table$carb %in% input$carb]
}

data_table<-mtcars    

#ui
ui = fluidPage( 
  sidebarLayout(
    sidebarPanel (

      uiOutput("vs_selector"),
      uiOutput("carb_selector"),
      uiOutput("disp_selector")),


    mainPanel(

      DT::dataTableOutput('mytable') 

    )

))




#server
server = function(input, output, session) {

  output$vs_selector <- renderUI({

    selectInput(inputId = "vs",
                label = "vs:", multiple = TRUE,
                choices = c( unique(data_table$vs)),
                selected = c(0,1))

  })

  output$carb_selector <- renderUI({

    req(input$vs)

    available0 <- data_table[c(data_table$vs %in% input$vs ), "carb"]  

    selectInput(
      inputId = "carb", 
      label = "carb:",
      multiple = TRUE,
      choices = c('All',as.character(unique(available0))),
      selected = 'All')

  })


  output$disp_selector <- renderUI({
    req(input$vs, input$carb)

    available <- data_table[["disp"]][data_table$vs %in% input$vs]
    if(! "All" %in% input$carb){
      available <- available[data_table$carb %in% input$carb]
    }

    selectInput(
      inputId = "disp", 
      label = "disp:",
      multiple = TRUE,
      choices = c('All',as.character(unique(available))),
      selected = 'All')

  })



  thedata <- reactive({

    req(input$disp, input$vs, input$carb)

    data_table<-data_table[data_table$vs %in% input$vs,]

    if(! "All" %in% input$carb){
      data_table<-data_table[data_table$carb %in% input$carb,]
    }

    if(! "All" %in% input$disp){
      data_table<-data_table[data_table$disp %in% input$disp,]
    }

    data_table

  })


  output$mytable = DT::renderDataTable({

    DT::datatable( {     

      thedata()   # Call reactive thedata()

    })

  })

}  

shinyApp(ui = ui, server = server)

仅供参考,对于更清洁的解决方案,您可能对 shinyWidgets 包中的 selectizeGroupUI 感兴趣:

library(shiny)
library(shinyWidgets)

ui <- fluidPage(
  fluidRow(
    column(
      width = 10, offset = 1,
      tags$h3("Filter data with selectize group"),
      panel(
        selectizeGroupUI(
          id = "my-filters",
          params = list(
            disp = list(inputId = "disp", title = "disp:"),
            carb = list(inputId = "carb", title = "carb:"),
            vs = list(inputId = "vs", title = "vs:")
          )
        ), status = "primary"
      ),
      dataTableOutput(outputId = "table")
    )
  )
)

server <- function(input, output, session) {
  res_mod <- callModule(
    module = selectizeGroupServer,
    id = "my-filters",
    data = mtcars,
    vars = c("disp", "carb", "vs")
  )
  output$table <- renderDataTable(res_mod())
}

shinyApp(ui, server)

【讨论】:

  • 非常感谢斯蒂芬。我真的很感谢你付出的努力。你是个天才。干杯:)
  • 还有一件事,NA有时会出现在disp filter中。是否有可能摆脱NA
猜你喜欢
  • 2013-10-01
  • 1970-01-01
  • 2021-11-03
  • 2019-06-19
  • 2015-09-05
  • 2019-03-05
  • 1970-01-01
  • 2017-10-20
  • 2020-09-27
相关资源
最近更新 更多