【发布时间】: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