动态添加和删除对象以响应Shiny中的selectInput

时间:2018-02-01 14:55:51

标签: r shiny

我正在构建一个闪亮的应用程序来可视化大型地理数据集。我希望用户能够从下拉菜单中选择一个区域,然后复选框将显示在下拉菜单下方,其中包含第一个区域内较小地理区域的名称。然后,用户将能够单击每个复选框,并且该区域将在地图上突出显示,并且将向他们提供描述该区域的数据。

除了用户从下拉菜单中选择了一个区域并且其下方出现了复选框之外,它几乎可以正常工作,如果他们随后在下拉菜单中更改了他们的选择,则他们首次选择的复选框不会除去。相反,第二组复选框出现在它上面。

以下是我的代码的相关部分:

UI.R

    ui <- fluidPage(

  sidebarPanel(
    selectInput(inputId = 'region', choices = c('All', admin1_regions_list), label = 'Select an admin1 region:'), #creates drop down menu, first arguement is the id
    verbatimTextOutput('empty_box'), #creates empty box so that checkboxes will sit after it
  )
)

SERVER.R

server <- function(input, output){

observe({ # listens for input

    x <- input$region #input from drop down menu which has the id 'region'

      removeUI(selector = "div:has(> #admin2_checkboxes)", immediate = TRUE)      

      insertUI(
        selector = '#empty_box', #empty box is used as placeholder, sits just below first drop down menu in ui
        where = 'afterEnd', #where in relation to empty box should the checkbox input be
        ui = checkboxGroupInput(inputId = 'admin2_checkboxes', label = 'Select an admin2 region:',
                            choices = admin2_list)
          )
})
})

我认为在插入新的函数之前立即调用removeUI()函数会做我想做的事情,但它似乎没有做任何事情。这是因为选择器不正确吗? (我也将其设置为"div:has(> #empty_box)",即与inputUI()函数调用相同的选择器,但它也没有工作)。或者我需要重构我的代码吗?

1 个答案:

答案 0 :(得分:2)

我无法运行您的代码,我之前没有使用您的方法来解决此问题。但是,以下示例具有基于所选汽车品牌的动态更新组复选框。这是你追求的功能(如果不是方法)。

library(shiny)

ui <- fluidPage(

  sidebarPanel(
    selectInput('make', choices = c("-", "Merc", "Cadillac", "Fiat"), label = 'Select a car make:'), #creates drop down menu, first arguement is the id
    conditionalPanel(condition = "input.make != '-'",
                     uiOutput("select_car"))
  )
)


server <- function(input, output) {

  output$select_car <- renderUI({

    choices <- rownames(mtcars)[grep(input$make, rownames(mtcars))]

    checkboxGroupInput('cars', label = 'Select cars:',
                       choices = choices)
  })


}

shinyApp(ui, server)