根据Shiny上的单选按钮选择禁用textInput

时间:2015-06-14 16:02:34

标签: r shiny

说我有以下Shiny App:

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中执行此操作。

我尝试构建完整的标签&#34;手动&#34;通过使用uiOutputrenderUI(基于this)将HTML粘贴为字符串,选定的广播值和HTML的其余部分,但这并不起作用。

textInput生成此内容:

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

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

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

2 个答案:

答案 0 :(得分:12)

如果你使用shinyjs软件包,这种东西实际上非常简单 - 它的构建完全是因为这些问题经常出现。有一些名为disableenable的函数可以在服务器中调用以禁用/启用输入,或者您可以使用toggleState函数根据条件启用/禁用。以下是如何使用最少的代码实现您想要的,而无需使用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

答案 1 :(得分:4)

您可以使用服务器上的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)
相关问题