代码之家  ›  专栏  ›  技术社区  ›  ForEverNewbie

在使用“observe()”和“renderUI()”时不再满足条件后,条件输入仍显示在Shiny中`

  •  0
  • ForEverNewbie  · 技术社区  · 2 年前

    我有一个条件输入,只有当以前的输入具有特定值时,我才希望它出现在侧边栏面板中。与使用时不同 conditionalPanel() 如果我使用 if 语句,条件输入是用创建的 renderUI() 并在满足条件时相应地显示。然而,当条件不再满足时,即使条件输入的代码在内部,条件输入也不会消失 observe() 。这里是一个最小的例子:

    library(shiny)
    
    ui <- fluidPage(
      
      # Application title
      titlePanel("Conditional input"),
      
      sidebarLayout(
        sidebarPanel(
          
        
          
          selectInput(inputId = "input1",
                      label = "Input1",
                      choices = c("A","B"),
                      selected = "A"),
          
          uiOutput(outputId = "input2")
      
      
    
        ),
        mainPanel()
        
          
          
        )
      )
    
    
    server <- function(input, output){
    
      observe(
        
        if(input$input1 == "B"){
          
          output$input2 = renderUI({
            
            selectInput(inputId = "input2",
                        label = "Input2",
                        choices = c("option1",
                                    "option2"))
          })
        }
       
      
      )
    }
    
    shinyApp(ui = ui, server = server)
    

    开始

    enter image description here

    在输入1中选择合适的选项后,会显示条件输入2:

    enter image description here

    然而,当返回到input1中不再满足具有input2所需条件的选择时,这样的input2保持显示:

    enter image description here

    如上所述,当使用 条件面板() 条件输入按预期出现/消失,但是否可以通过一些小的修改使其也如最小示例所示工作?

    谢谢

    1 回复  |  直到 2 年前
        1
  •  2
  •   Limey    2 年前

    这里有一个简单的解决方案,可以满足您的需求。

    library(shiny)
    
    ui <- fluidPage(
      titlePanel("Conditional input"),
      sidebarLayout(
        sidebarPanel(
          selectInput(inputId = "input1",
                      label = "Input1",
                      choices = c("A","B"),
                      selected = "A"
          ),
          uiOutput(outputId = "uiPanel")
        ),
        mainPanel()
      )
    )
    
    server <- function(input, output){
      output$uiPanel <- renderUI({
        if (input$input1 == "B") {
          selectInput(inputId = "input2",
                          label = "Input2",
                          choices = c("option1", "option2")
          )
        }
      })
    }
    
    shinyApp(ui = ui, server = server)
    

    这个 renderUI 退货 NULL 如果 input$input1 == "A" 。请注意,我已将重命名为 uiOutput 以避免ID冲突,并重构代码以删除对的冗余调用 observe() 。这没有必要,因为引用 input$input1 内部 renderUI 调用是在需要时触发调用所必需的全部内容。

    推荐文章