【问题标题】:Dependent filter in shiny inputs闪亮输入中的相关过滤器
【发布时间】:2018-05-16 00:35:21
【问题描述】:

示例来自:Filter one selectInput based on selection from another selectInput?

我正在尝试创建一个闪亮的应用程序,用户可以在其中选择多个框,然后生成一些数据。我不明白如果我首先点击“火星”,然后第二个选项糖果被过滤,我现在想选择“士力架”,为什么点击士力架时一切都会恢复?

library(shiny)
library(shinydashboard)
library(shinyWidgets)
##
ui <- shinyUI({
  sidebarPanel(

    htmlOutput("brand_selector"),
    htmlOutput("candy_selector"))

})
##
server <- shinyServer(function(input, output) {
  candyData <- read.table(
    text = "Brand       Candy
    Nestle      100Grand
    Netle       Butterfinger
    Nestle      Crunch
    Hershey's   KitKat
    Hershey's   Reeses
    Hershey's   Mounds
    Mars        Snickers
    Mars        Twix
    Mars        M&Ms",
    header = TRUE,
    stringsAsFactors = FALSE)

  output$brand_selector <- renderUI({

    available2 <- candyData
    if(NROW(input$candy) > 0 ) available2 <- candyData[candyData$Candy %in% input$candy, ]

    pickerInput(
      inputId = "brand", 
      label = "Brand:",
      choices = as.character(unique(available2$Brand)),
      multiple = T,options = list(`actions-box` = TRUE))

  })

  output$candy_selector <- renderUI({

    available <- candyData
    if(NROW(input$brand > 0)) available <- candyData[candyData$Brand %in% input$brand, ]

    pickerInput(
      inputId = "candy", 
      label = "Candy:",
      choices = unique(available$Candy),
      multiple = T,options = list(`actions-box` = TRUE))

  })

})
##
shinyApp(ui = ui, server = server)

【问题讨论】:

    标签: r shiny shinydashboard


    【解决方案1】:

    问题在于您的渲染 UI 与输入变量相互依赖,并且当您更改整个 UI 时重新渲染,包括输入变量的值。对于这个用例,您最好使用 update*Input 函数。这是您示例的工作版本

    library(shiny)
    library(shinydashboard)
    library(shinyWidgets)
    ##
    ui <- shinyUI({
      sidebarPanel(
    
        htmlOutput("brand_selector"),
        htmlOutput("candy_selector"))
    
    })
    ##
    server <- shinyServer(function(input, output,session) {
      candyData <- read.table(
        text = "Brand       Candy
        Nestle      100Grand
        Netle       Butterfinger
        Nestle      Crunch
        Hershey's   KitKat
        Hershey's   Reeses
        Hershey's   Mounds
        Mars        Snickers
        Mars        Twix
        Mars        M&Ms",
        header = TRUE,
        stringsAsFactors = FALSE)
      observeEvent({
        input$candy
      },
      {
        available2 <- candyData
        if(NROW(input$candy) > 0 ) available2 <- candyData[candyData$Candy %in% input$candy, ]
        updatePickerInput(
          session = session,
          inputId = "brand", 
          choices = as.character(unique(available2$Brand)),
          selected = input$brand
        )
      },
      ignoreInit = FALSE,
      ignoreNULL = FALSE)
      output$brand_selector <- renderUI({
    
    
        pickerInput(
          inputId = "brand", 
          label = "Brand:",
          choices = NULL,
          multiple = T,options = list(`actions-box` = TRUE))
    
      })
      observeEvent({
       input$brand
      },{
        available <- candyData
        if(NROW(input$brand > 0)) available <- candyData[candyData$Brand %in% input$brand, ]
        updatePickerInput(
          session = session,
          inputId = "candy",
          choices = unique(available$Candy),
          selected = input$candy
        )
      },
      ignoreInit = FALSE,
      ignoreNULL = FALSE)
      output$candy_selector <- renderUI({
    
    
        pickerInput(
          inputId = "candy", 
          label = "Candy:",
          choices = NULL,
          multiple = T,options = list(`actions-box` = TRUE))
    
      })
    
    })
    ##
    shinyApp(ui = ui, server = server)
    

    【讨论】:

    • 我想指出,“selected = input$candy”是让 UI 不会默认为单选列表的第一个值和多选列表的没有值的原因。
    猜你喜欢
    • 1970-01-01
    • 2016-07-05
    • 2020-08-18
    • 2015-11-15
    • 2021-06-29
    • 2015-01-19
    • 2019-08-17
    • 2018-08-09
    • 1970-01-01
    相关资源
    最近更新 更多