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