根据 Shiny 上的单选按钮选择禁用文本输入

Disable textInput based on radio button selection on Shiny

假设我有以下闪亮的应用程序:

library(shiny)
ui <- fluidPage(
  column(3,
         radioButtons("radios", "",
                      c("Enabled" = "enabled",
                        "Disabled" = "disabled"),
                      inline = TRUE)
  ),
  column(4, textInput("text", "", value = "Disable me"))
)
server <- function(input, output) {

}
shinyApp(ui=ui, server=server)

根据所选单选按钮禁用 textInput 的最简单方法是什么?我知道我只需要将 ... disabled /> 添加到 input 标签,但我不知道如何在 Shiny 中添加。

我尝试通过将 HTML 粘贴为字符串、选定的单选值和 HTML 的其余部分来构建完整标签 "manually",使用 uiOutputrenderUI(基于 this),但这没有用。

textInput生成这个:

<input id="text" type="text" class="form-control" value="Disable me"/>

我需要能够在上面和这个之间切换:

<input id="text" type="text" class="form-control" value="Disable me" disabled />

您可以使用服务器上的 session$sendCustomMessage(生成禁用或启用文本框的 javascript)和 UI 中的 Shiny.addCustomMessageHandler(执行javascript).

library(shiny)
ui <- fluidPage(
  tags$head(tags$script(HTML('
      Shiny.addCustomMessageHandler("jsCode",
        function(message) {
          eval(message.code);
        }
      );
    '))),
  column(3,
         radioButtons("radios", "",
                      c("Enabled" = "enabled",
                        "Disabled" = "disabled"),
                      inline = TRUE)
  ),
  column(4, textInput("text", "", value = "Disable me"))
)
server <- function(input, output, session) {
  observe({
    if(input$radios == "disabled") {
      session$sendCustomMessage(type="jsCode",
                                list(code= "$('#text').prop('disabled',true)"))
    } else {
      session$sendCustomMessage(type="jsCode",
                                list(code= "$('#text').prop('disabled',false)"))
    }
  })
}
shinyApp(ui=ui, server=server)

如果你使用 shinyjs 包,这种东西实际上是非常微不足道的 - 它的构建正是因为这些问题经常出现。有一些叫做 disableenable 的函数,你可以在你的服务器中调用它们来 disable/enable 一个输入,或者你可以使用 toggleState 函数来 enable/disable在一个条件下。以下是如何使用最少的代码实现您想要的而无需使用 JavaScript:

library(shiny)
ui <- fluidPage(
  shinyjs::useShinyjs(),
  column(3,
         radioButtons("radios", "",
                      c("Enabled" = "enabled",
                        "Disabled" = "disabled"),
                      inline = TRUE)
  ),
  column(4, textInput("text", "", value = "Disable me"))
)
server <- function(input, output, session) {
  observe({
    shinyjs::toggleState("text", input$radios == "enabled")
  })
}
shinyApp(ui=ui, server=server)

要修改您的原始代码,我所要做的就是添加对 shinyjs::useShinyjs() 的调用,将 session 参数添加到服务器,然后添加对 shinyjs::toggleState() 的调用。

免责声明:我写了 shinyjs