【问题标题】:Interdependent Filter cascading in R Shiny - updatePickerInputR Shiny中的相互依赖的过滤器级联 - updatePickerInput
【发布时间】:2021-08-25 19:37:13
【问题描述】:

我在 R Shiny 应用程序中有 4 个 PickerInputs,输出是从这些输入中过滤出来的数据帧。有时会选择这些输入,有时则不会(意味着不应用任何过滤器)。

问题:我希望所有这些输入通过相互选择而级联。

column(width=2, id="filters",
       
       shinyWidgets::pickerInput(
         inputId = "filter_a",
         label = 'Filter A',
         choices = c(""),
         multiple = FALSE),
       
       shinyWidgets::pickerInput(
         inputId = "filter_b",
         label = 'Filter B',
         choices = c(""),
         multiple = FALSE),
       
       shinyWidgets::pickerInput(
         inputId = "filter_c",
         label = 'Filter C',
         choices = c(""),
         multiple = FALSE),
       
       shinyWidgets::pickerInput(
         inputId = "filter_d",
         label = 'Filter D',
         choices = c(""),
         multiple = FALSE)
       )

服务器: 编写这些相互依赖的过滤器级联的 if-else 方式看起来并不好。它绝对不是优化的代码。我怎样才能把它写成一个函数?

我需要每个过滤器来观察其他 3 个过滤器,并更新选择。

更新“过滤器 C”的示例:

observeEvent(c(input$filter_a, input$filter_b, input$filter_d),
             
             {updatePickerInput(session = session,
                                inputId = 'filter_c',
                                
                                choices = if(input$filter_a==" All" & input$filter_b == " All" & input$filter_d == " All"){sort(c(" All", unique(df$column_c)))
                                }else if(input$filter_a ==" All" & input$filter_b == " All" & input$filter_d != " All"){sort(c(" All", unique(df$column_c[df$column_d==input$filter_d])))
                                }else if(input$filter_a ==" All" & input$filter_b != " All" & input$filter_d == " All"){sort(c(" All", unique(df$column_c[df$column_b==input$filter_b])))
                                }else if(input$filter_a !=" All" & input$filter_b == " All" & input$filter_d == " All"){sort(c(" All", unique(df$column_c[df$column_a==input$filter_a])))
                                }else if(input$filter_a ==" All" & input$filter_b != " All" & input$filter_d != " All"){sort(c(" All", unique(df$column_c[df$column_b==input$filter_b & df$column_d==input$filter_d])))
                                }else if(input$filter_a !=" All" & input$filter_b == " All" & input$filter_d != " All"){sort(c(" All", unique(df$column_c[df$column_a==input$filter_a & df$column_d==input$filter_d])))
                                }else if(input$filter_a !=" All" & input$filter_b != " All" & input$filter_d == " All"){sort(c(" All", unique(df$column_c[df$column_a==input$filter_a & df$column_b==input$filter_b])))
                                }else{sort(c(" All", unique(df$column_c[df$column_a==input$filter_a & df$column_b==input$filter_b & df$column_d==input$filter_d])))},
                                selected = c(" All"))
             })

column_a、column_b、column_c 和 column_d 是我的 df 中的 4 个过滤器列,我分别根据它们选择 filter_a、filter_b、filter_c、filter_d。

【问题讨论】:

  • 你应该考虑uiOutput()renderUI()的用法。
  • 使用case_when() 而不是那么多ifelse

标签: r shiny user-input shinydashboard shiny-server


【解决方案1】:

或许这样会好一点

observeEvent(c(input$filter_a, input$filter_b, input$filter_d), {
   
  if(input$filter_a==" All") {fa <- unique(df$column_a)} else fa <- input$filter_a
  if(input$filter_b==" All") {fb <- unique(df$column_b)} else fb <- input$filter_b
  if(input$filter_d==" All") {fd <- unique(df$column_d)} else fd <- input$filter_d

  choices <- c(" All", unique(df$column_c[df$column_a %in% fa & df$column_b %in% fb & df$column_d %in% fd]))
  updatePickerInput(session = session, inputId = 'filter_c', choices = choices, selected = c(" All"))

})

【讨论】:

    猜你喜欢
    • 2023-01-23
    • 2020-02-02
    • 1970-01-01
    • 2021-01-26
    • 1970-01-01
    • 2017-07-15
    • 2017-05-28
    • 2023-01-07
    • 2020-01-03
    相关资源
    最近更新 更多