闪亮的复选框取消选中 - 交叉引用同一个renderUI调用中的输入

时间:2016-02-22 11:49:38

标签: r user-interface shiny

我打算使用renderUI在我闪亮的应用程序中显示一些可选的额外按钮。我希望在同一个renderUI调用中插入新按钮。我写了一个renderUI探索,如果第一个按钮的输入不为空且(&&)为TRUE,则仅渲染第二个按钮。它不起作用,因为第一个按钮在检查时会再次快速取消选中。我通过分成两个renderUI调用来解决问题。

我的问题是:

  • 为什么第一个代码片确实失败了?
  • 是否可以实现第二个代码段仅在一个renderUI调用中执行的操作?

library(shiny)
ui = fluidPage(
  uiOutput("checkUI")
)
server = function(input,output) {
  output$checkUI = renderUI({
    list(
      checkboxInput('check1',"check me first"),
      if(!is.null(input$check1)&&input$check1==T)  {
        checkboxInput('check2',"check me to win") 
      } else { 
        NULL
      }
    )
  })
}
shinyApp(ui,server)

但这有效......

ui = fluidPage(
  uiOutput("checkUI"),
  uiOutput("textUI")

)
server = function(input,output) {
  #UI first button
  output$checkUI = renderUI({
    list(
      checkboxInput('check1',"check me first")
    )
  })

  #UI second button
  output$textUI = renderUI({
    list(
      if(!is.null(input$check1) && input$check1)
        checkboxInput('check2',"check me to win") else NULL
    )
  })
}

shinyApp(ui,server)

1 个答案:

答案 0 :(得分:1)

您的第一段代码失败,因为每次输入发生更改时,renderUI都会运行,因此当您选中第一个复选框时。既然你有:

checkboxInput('check1',"check me first")

renderUI立即重置input$check1,然后再次运行renderUI,取消设置复选框。这就是第二个复选框短暂闪烁的原因。

幸运的是,这是一个常见的问题,因此conditionalPanel s有一个闪亮的解决方案:

library(shiny)
ui = fluidPage(
  checkboxInput('check1',"check me first"),
  conditionalPanel(
    condition = "input.check1 == true",
    checkboxInput("check2", "check me to win")
  )
)
server = function(input,output){

}

shinyApp(ui,server)