使用复选框启用/禁用输出

时间:2018-03-09 04:59:42

标签: r shiny

我在R中使用shiny。我希望使用复选框来控制是否应启用numericInput

library(shiny)

my_UI <- fluidPage(
  shinyjs::useShinyjs(),
  fluidRow(numericInput("test", NULL, 1)),
  fluidRow(checkboxInput("chk", "NULL"))
)

my_Server <- function(input, output) {
  react <- reactive({
    input$chk
  })
  observeEvent(react(), shinyjs::disable("test"))
  observeEvent(!react(), shinyjs::enable("test"))
}

shinyApp(my_UI, my_Server)

然而,该应用程序并不总是对我的检查/取消选中框作出反应。另外,有时命令会以其他方式执行(即,在未选中时检查和禁用时启用)。谁能给我一些关于发生了什么的指导?谢谢!

1 个答案:

答案 0 :(得分:1)

您尝试使用观察者,就好像他们是if语句一样。 observeEvent()的第一个参数是一个反应式表达式,只要该表达式失效,观察者就会触发。如果你有react()!react()那么无关紧要 - 观察者会触发任何一种方式。要查看此操作,请在两个观察者中添加一个print语句,并且每次更改输入时都会看到它们都被触发。

你要做的是:

observeEvent(react(), {
    if (react()) {
        shinyjs::disable("test")
    } else {
        shinyjs::enable("test")
    }
})

只要react()发生变化,此代码块就会进入,无论它是真还是假。在观察者内部检查值,并相应地禁用/启用。

另一种更有效的方法是使用shinyjs::toggleState()

observeEvent(react(), {
    shinyjs::toggleState("test", condition = !react())
})