【问题标题】:Shiny dynamic filter of dataframe闪亮的数据框动态过滤器
【发布时间】:2020-02-24 09:37:08
【问题描述】:

我知道已经有一些关于这个主题的问题,但我仍在为自己的项目而苦苦挣扎。

在我的闪亮中,有三个选择输入小部件应该相互反应。只有有意义的组合才是可能的。

代码现已更新为使用 mtcars。一些变量名称现在很奇怪,但这应该很重要。

library(shiny)

ui <- fluidPage(
  selectInput(inputId = "INseason", label = "Season", choices = c("ALL", sort(unique(mtcars$am), decreasing = TRUE)), selected = NULL),
  selectInput(inputId = "INcategory",  label = "Category", choices = c("ALL", sort(unique(mtcars$gear))), selected = NULL),
  selectInput(inputId = "INteams", label = "Team", choices = c("ALL", sort(unique(mtcars$carb))), selected = NULL)

)

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

  rv <- reactiveValues()
  rv$data <- mtcars

  observe({

    if(input$INseason != "ALL") {
      rv$data <- filter(rv$data, am == input$INseason)
    }
    if(input$INcategory != "ALL") {
      rv$data <- filter(rv$data, gear == input$INcategory)
    }
    if(input$INteams != "ALL") {
      rv$data <- filter(rv$data, carb == input$INteams)
    }

  })

  observe({
    updateSelectInput(session, "INseason", choices = c("ALL", sort(unique(rv$data$am), decreasing = TRUE)))
    updateSelectInput(session, "INcategory", choices = c("ALL", sort(unique(rv$data$gear))))
    updateSelectInput(session, "INteams", choices = c("ALL", sort(unique(rv$data$carb))))
  })

}

shinyApp(ui, server)

使用此代码,我无法选择某些内容,因为“ALL”已被预先选择。

感谢您的帮助!

最好的

【问题讨论】:

  • 您应该为Shot_Data.rds 提供样本数据集或使用mtcars 等开源数据
  • 感谢您的提示。我将代码更改为 mtcars

标签: r dynamic filter shiny


【解决方案1】:

您必须将selected 参数传递回updateSelectInput,否则它将始终默认为第一个类别(即使选择了某些内容)。

将最后一个块替换为:

  observe({
    updateSelectInput(session, "INseason", 
                      choices = c("ALL", sort(unique(rv$data$am), decreasing = TRUE)),
                      selected = if(is.null(input$INseason)) "ALL" else input$INseason)
    updateSelectInput(session, "INcategory", 
                      choices = c("ALL", sort(unique(rv$data$gear))),
                      selected = if(is.null(input$INcategory)) "ALL" else input$INcategory)
    updateSelectInput(session, "INteams",
                      choices = c("ALL", sort(unique(rv$data$carb))),
                      selected = if(is.null(input$INteams)) "ALL" else input$INteams)
  })

(这段代码可以更简洁,但它可以工作!)

【讨论】:

    猜你喜欢
    • 2018-02-04
    • 1970-01-01
    • 2020-10-30
    • 1970-01-01
    • 2018-02-13
    • 1970-01-01
    • 2015-01-19
    • 2019-07-04
    • 2018-10-04
    相关资源
    最近更新 更多