R Shiny 中的相互依赖过滤器级联 - updatePickerInput
Interdependent Filter cascading in R Shiny - updatePickerInput
我在 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)
)
服务器:
这些相互依赖的filter级联的if-else写法看起来不太好。它绝对不是优化的代码。我怎样才能把它写成一个函数?
我需要每个过滤器观察其他 3 个过滤器,并更新选择。
更新示例 'filter 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 是我选择 filter_a、[=分别为 30=、filter_c、filter_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"))
})
我在 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)
)
服务器: 这些相互依赖的filter级联的if-else写法看起来不太好。它绝对不是优化的代码。我怎样才能把它写成一个函数?
我需要每个过滤器观察其他 3 个过滤器,并更新选择。
更新示例 'filter 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 是我选择 filter_a、[=分别为 30=、filter_c、filter_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"))
})