在R Shiny中动态删除UI下拉元素。

问题描述 投票:0回答:1

可能是非常基本的问题--但我无法将我发现的类似帖子翻译成我的确切问题。

在一个R Shiny应用程序中,我有一个由服务器上产生的矢量填充的第一个下拉菜单--这允许我做出一组选择。

我想有一个勾选框,然后引入第二个下拉菜单--但我希望如果我取消勾选框,下拉菜单就会消失。

我已经试过了--请看下面的MWE--这个图只是为了保持我原始代码的结构(显然我知道我的下拉框什么都不做,但在原始代码中不是这样的,但我希望MWE尽可能的 "M")。

如果我去掉 removeUI() 行,然后勾选勾选框,确实创建了一个新的下拉菜单--但是取消勾选框却无法删除它。

很明显我漏掉了一些东西;任何帮助都非常感激,因为我完全不擅长R Shiny,但我真的想变得更好!可能是非常基本的问题--但无法翻译我发现的类似帖子。

library(shiny)
library(shinyMobile)

# define UI elements
ui <- f7Page(

  f7SingleLayout(
    navbar = f7Navbar(
    ),
    f7Card(htmlOutput("initial_drop_down"), #first drop down
           f7checkBox(inputId = "switch", label = "Introduce second choice", FALSE), #tick box for second drop down if required
           htmlOutput("reactive_drop_down") #second drop down
    ),
    f7Shadow(
      intensity = 16,
      f7Card(
        plotOutput("distPlot", height = "800px") # plot - originally linked to drop down choices but an arbitrary graph here for simplicity
      )
    )  
  )


)

# server calculations
server <- function(input, output) {
  library(ggplot2)

  # generate first drop down - done on server side since usually choices vector is comprised of information read in from files
  output$initial_drop_down = renderUI({ 
    selectInput(inputId = "initial_choice",
                label = "First choice:",
                choices = c("Choice 1", "Choice 2", "Choice 3")) 
  })

  observeEvent(input$initial_choice, {

    # trying to add second drop down based on action in switch - not convinced my use of observeEvent is quite right - issue likely sits in here.
    observeEvent(input$switch, {

      if(input$switch == T){

        output$reactive_drop_down = renderUI({ 
          selectInput(inputId = "second_choice", 
                      label = "Second (dynamic) choice:", 
                      choices = c(1,2,3)) 
        })
      }else{
        removeUI(selector ="#reactive_drop_down")
      }
    })

    output$distPlot <- renderPlot({
      ggplot(data = cars) + geom_line(aes(x=speed, y=dist))
    })
  })
}

# Run the application 
shinyApp(ui = ui, server = server)
r shiny
1个回答
0
投票

你可以使用 conditionalPanel? 把你的 htmlOutput 你的第二个输入在你的 ui. 我将避免使用嵌套的 observeEventoutput.

library(shiny)
library(shinyMobile)
library(ggplot2)

# define UI elements
ui <- f7Page(
  f7SingleLayout(
    navbar = f7Navbar(
    ),
    f7Card(htmlOutput("initial_drop_down"), #first drop down
           f7checkBox(inputId = "switch", label = "Introduce second choice", FALSE), #tick box for second drop down if required
           conditionalPanel(
             condition = "input.switch==1",
             htmlOutput("reactive_drop_down") #second drop down
           )
    ),
    f7Shadow(
      intensity = 16,
      f7Card(
        plotOutput("distPlot", height = "800px") # plot - originally linked to drop down choices but an arbitrary graph here for simplicity
      )
    )  
  )
)

# server calculations
server <- function(input, output) {

  # generate first drop down - done on server side since usually choices vector is comprised of information read in from files
  output$initial_drop_down = renderUI({ 
    selectInput(inputId = "initial_choice",
                label = "First choice:",
                choices = c("Choice 1", "Choice 2", "Choice 3")) 
  })

  output$reactive_drop_down = renderUI({ 
    selectInput(inputId = "second_choice", 
                label = "Second (dynamic) choice:", 
                choices = c(1,2,3)) 
  })

  output$distPlot <- renderPlot({
    ggplot(data = cars) + geom_line(aes(x=speed, y=dist))
  })

}

# Run the application 
shinyApp(ui = ui, server = server)
© www.soinside.com 2019 - 2024. All rights reserved.