使用 shiny updateRadioButtons 和 shinyjs disable/enable
Using shiny updateRadioButtons with shinyjs disable/enable
我需要限制用户使用 select 单选按钮,但始终显示它们。我使用 shinyjs::disable
禁用按钮并使用 updateRadioButtons
更新 selection ,但它似乎无法正常工作。只有更新似乎有效,而不是禁用我的代码:
library(shiny)
library(shinyjs)
server = shinyServer(function(input, output, session) {
observeEvent(input$toggle, {
if (input$toggle == "enable") {
updateRadioButtons(session, "button1", "",
c("one" = "one", "two" = "two"),
inline = T, selected = "one")
shinyjs::enable("button1")
}
if (input$toggle == "disable") {
updateRadioButtons(session, "button1", "",
c("one" = "one", "two" = "two"),
inline = T, selected = "two")
shinyjs::disable("button1")
}
})
})
ui = shinyUI(
fluidPage(
shinyjs::useShinyjs(),
radioButtons("toggle", "",
c("enable" = "enable", "disable" = "disable"), inline = T),
radioButtons("button1", "",
c("one" = "one", "two" = "two"), inline = T)
))
shinyApp(ui=ui,server=server)
发生这种情况是因为更新功能实际上稍后才进行更新。所以发生的事情是调用更新函数,然后调用禁用,按钮被禁用,稍后按钮从更新中重新生成。这是因为 shiny 的内部结构是如何工作的。如果您注释掉更新功能,您会看到该按钮确实被禁用了。这有点烦人,但这只是 shiny 工作方式的副作用。您可以尝试的一种 hacky 解决方案是使用 shinyjs::delay(100, disable(id))
而不是 disable(id)
(这意味着您将添加 100 毫秒的短暂延迟,然后才禁用)。
我需要限制用户使用 select 单选按钮,但始终显示它们。我使用 shinyjs::disable
禁用按钮并使用 updateRadioButtons
更新 selection ,但它似乎无法正常工作。只有更新似乎有效,而不是禁用我的代码:
library(shiny)
library(shinyjs)
server = shinyServer(function(input, output, session) {
observeEvent(input$toggle, {
if (input$toggle == "enable") {
updateRadioButtons(session, "button1", "",
c("one" = "one", "two" = "two"),
inline = T, selected = "one")
shinyjs::enable("button1")
}
if (input$toggle == "disable") {
updateRadioButtons(session, "button1", "",
c("one" = "one", "two" = "two"),
inline = T, selected = "two")
shinyjs::disable("button1")
}
})
})
ui = shinyUI(
fluidPage(
shinyjs::useShinyjs(),
radioButtons("toggle", "",
c("enable" = "enable", "disable" = "disable"), inline = T),
radioButtons("button1", "",
c("one" = "one", "two" = "two"), inline = T)
))
shinyApp(ui=ui,server=server)
发生这种情况是因为更新功能实际上稍后才进行更新。所以发生的事情是调用更新函数,然后调用禁用,按钮被禁用,稍后按钮从更新中重新生成。这是因为 shiny 的内部结构是如何工作的。如果您注释掉更新功能,您会看到该按钮确实被禁用了。这有点烦人,但这只是 shiny 工作方式的副作用。您可以尝试的一种 hacky 解决方案是使用 shinyjs::delay(100, disable(id))
而不是 disable(id)
(这意味着您将添加 100 毫秒的短暂延迟,然后才禁用)。