Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R-input中的相互依赖的过滤器级联_R_Shiny_User Input_Shinydashboard_Shiny Server - Fatal编程技术网

R-input中的相互依赖的过滤器级联

R-input中的相互依赖的过滤器级联,r,shiny,user-input,shinydashboard,shiny-server,R,Shiny,User Input,Shinydashboard,Shiny Server,我在R Shining应用程序中有4个PickerInput,输出是从这些输入中筛选出的数据帧。有时选择这些输入,有时不选择(表示不应用任何过滤器) 问题:我希望所有这些输入通过相互选择进行级联 column(width=2, id="filters", shinyWidgets::pickerInput( inputId = "filter_a", label = 'Filter A',

我在R Shining应用程序中有4个PickerInput,输出是从这些输入中筛选出的数据帧。有时选择这些输入,有时不选择(表示不应用任何过滤器)

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

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"))
             })

列a、列b、列c和列d是我的df中的4个筛选列,我根据它们分别选择筛选a、筛选b、筛选c、筛选d。

也许这会稍微好一点

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"))

})
observeEvent(c(输入$filter\u a,输入$filter\u b,输入$filter\u d){

如果(input$filter\u a==“All”){fa,你应该考虑
uiOutput()
renderUI()
的用法。使用
case\u when()
而不是这么多
ifelse