R Shiny:如何构建一个函数来在 R 中创建许多类似的 renderUI 选择器?

R Shiny: How to build a function to create many similar renderUI pickers in R?

我正在从事一个项目,该项目需要许多本质上做同样事情的挑选器。我不能在 Shiny Dashboard 中多次使用相同的 renderUI 输出,所以我最终通过复制、粘贴和更改小东西(例如变量名)来克服这个问题。但是,我的仪表板的代码现在接近一千多行,我想用一个函数来简化这个过程,我可以在其中传递参数并输出一个唯一的 renderUI 对象。下面是我创建的类似 renderUI 选择器的示例:

# Region Picker
output$picker_Region_Map <- renderUI({
  ls_regions_map <- df_raw %>%
    distinct(Region) %>%
    pull()
  pickerInput(
    inputId = "mapRegion"
    , label = "Region"
    , choices = ls_regions_map 
    , multiple = TRUE
    , selected = ls_regions_map
    , options = list(`actions-box` = TRUE))  
}) #renderUI End

# Campus Picker
output$picker_Campus_Map <- renderUI({
  ls_campus_map <- df_raw %>%
    filter(Region %in% input$mapRegion) %>%
    distinct(Campus) %>%
    pull()
  pickerInput(
    inputId = "mapCampus"
    , label = "Campus" 
    , choices = ls_campus_map
    , multiple = TRUE
    , selected = ls_campus_map
    , options = list(`actions-box` = TRUE)) 
}) #renderUI End

# Region Picker
output$picker_Region<- renderUI({
  ls_regions <- df_raw %>%
    distinct(Region) %>%
    pull()
  pickerInput(
    inputId = "inRegion"
    , label = "Region"
    , choices = ls_regions 
    , multiple = TRUE
    , selected = ls_regions 
    , options = list(`actions-box` = TRUE))
}) #renderUI End

# Campus Picker
output$picker_Campus <- renderUI({
  ls_campus <- df_raw %>%
    filter(Region %in% input$inRegion) %>%
    distinct(Campus) %>%
    pull()
  pickerInput(
    inputId = "inCampus"
    , label = "Campus" 
    , choices = ls_campus
    , multiple = TRUE
    , selected = ls_campus
    , options = list(`actions-box` = TRUE))
}) #renderUI End

有没有人有过这种经历?有什么建议吗?

这是我在网站上的第一个问题,所以如果有任何格式不正确或不符合指南/礼仪的地方,请告诉我!

谢谢!

下面是我可能如何开始重构校园选择器。

这将出现在我的全局脚本中:

standardPicker <- function(.inputId, .label, .choices) { 
    pickerInput(inputId = .inputId, label = .label, choices = .choices, 
        selected = .choices, multiple = T, options = list('actions-box' = TRUE))
 }

这将出现在我的服务器中:

ls_campus <- reactive({
    df_raw %>%
    filter(Region %in% input$inRegion) %>%
    distinct(Campus) %>%
    pull()
 })

 output$picker_Campus <- renderUI(standardPicker('inCampus','Campus',ls_campus())