【问题标题】:Filter one selectInput based on selection from another selectInput?根据从另一个 selectInput 中的选择过滤一个 selectInput?
【发布时间】:2016-01-10 06:40:42
【问题描述】:

我有两个selectInputs,我希望第一个(品牌)中的选择可以更改第二个(糖果)中的可能选择。因此,例如,如果有人在第一个输入框中选择了“雀巢”,那么只有雀巢糖果棒会出现在第二个框中。我的数据表有一个品牌列和一个糖果棒类型列。

我有以下代码要开始,但这会显示所有选择,无论选择如何。

selectInput(inputId="brand", 
                  label="Brand:",
                  choices=as.character
                  (unique(candyData$Brand)),
                  selected = "Nestle"
    ),
    selectInput(inputId="candy", 
                label="Candy:",
                choices=as.character
                (unique(candyData$Candy)),
                selected = "100Grand"

数据集如下所示:

Brand       Candy
Nestle      100Grand
Netle       Butterfinger
Nestle      Crunch
Hershey's   KitKat
Hershey's   Reeses
Hershey's   Mounds
Mars        Snickers
Mars        Twix
Mars        M&Ms

更新问题 如何根据后续过滤更新仪表板中的 ValueBox?

output$count <- renderValueBox({

    valueBox(
      value = nrow(candyData),
      subtitle = "Number of Candy Bars",
      icon = icon("table")
    )
  })

【问题讨论】:

  • 请包含您的数据集candyData,以及您的应用程序的其余代码。
  • nrussell,示例数据集已显示。

标签: r shiny shinydashboard


【解决方案1】:

这是一种方法:

library(shiny)
library(shinydashboard)
##
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({

    selectInput(
      inputId = "brand", 
      label = "Brand:",
      choices = as.character(unique(candyData$Brand)),
      selected = "Nestle")

  })

  output$candy_selector <- renderUI({

    available <- candyData[candyData$Brand == input$brand, "Candy"]

    selectInput(
      inputId = "candy", 
      label = "Candy:",
      choices = unique(available),
      selected = unique(available)[1])

  })

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

更新:

你可以修改ui定义为

ui <- shinyUI({
  sidebarPanel(

    htmlOutput("brand_selector"),
    htmlOutput("candy_selector"),
    valueBoxOutput("count"))

})

并将以下内容添加到server

output$count <- renderValueBox({

  available <- candyData[candyData$Brand == input$brand, ]

  valueBox(
    value = nrow(available),
    subtitle = sprintf("Number of %s Candy Bars", input$brand),
    icon = icon("table"))

})

【讨论】:

  • nrussell,其实我还有一个问题。在我的 Shiny 应用程序的顶部,我有一个计数器,显示数据集中的糖果条总数。我怎样才能让这个计数器根据后续过滤自动更新?我将我当前的代码放在一个修订版中。
  • @Nick 已更新 - 为了将来参考,您应该提出 单独的 问题,即使它与原始问题有关,以便通过以下方式更轻松地搜索信息本网站的其他用户。
  • 感谢您的反馈和更新。非常感谢您的帮助!
  • 如果我想添加第三级过滤,available2 会是什么? available2
  • 正如我在第一条评论中所指出的,您需要提出一个新问题,而不是针对原始问题添加子问题。
猜你喜欢
  • 2021-01-22
  • 2017-10-19
  • 1970-01-01
  • 2021-05-17
  • 2016-04-28
  • 1970-01-01
  • 2013-10-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多