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

Mol*_*olx 6 r 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)
Run Code Online (Sandbox Code Playgroud)

textInput基于所选单选按钮禁用基本按钮的最简单方法是什么?我知道我只需要添加... disabled />input标签,但我对如何做,在闪亮的不知道.

我尝试通过将HTML粘贴为字符串,选定的无线电值和HTML的其余部分,使用uiOutputrenderUI(基于)来"手动"构建完整标记,但这不起作用.

textInput产生这样的:

<input id="text" type="text" class="form-control" value="Disable me"/>
Run Code Online (Sandbox Code Playgroud)

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

<input id="text" type="text" class="form-control" value="Disable me" disabled />
Run Code Online (Sandbox Code Playgroud)

Dea*_*ali 13

如果你使用这个shinyjs包,这种东西实际上是非常微不足道的- 它的构建正是因为这些问题经常出现.有被调用的函数disable,并enable可以在你的服务器调用来禁用/启用输入,也可以使用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)
Run Code Online (Sandbox Code Playgroud)

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

免责声明:我写了shinyjs


jos*_*ber 4

session$sendCustomMessage您可以在服务器(生成禁用或启用文本框的 javascript)和Shiny.addCustomMessageHandlerUI(执行 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)
Run Code Online (Sandbox Code Playgroud)