【问题标题】:Disable textInput based on radio button selection on Shiny根据 Shiny 上的单选按钮选择禁用 textInput
【发布时间】:2015-06-14 16:02:33
【问题描述】:

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

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 /&gt; 添加到 input 标签,但我不知道如何在 Shiny 中做到这一点。

我尝试使用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 />

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    如果你使用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

    【讨论】:

    • https://stackoverflow.com/questions/52767011/how-to-hide-tabsetpanel-upon-radiobutton-input-in-shiny-r
    【解决方案2】:

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

    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)
    

    【讨论】:

      猜你喜欢
      • 2021-04-04
      • 2020-07-12
      • 2017-06-30
      • 1970-01-01
      • 2014-10-27
      • 2019-10-18
      • 1970-01-01
      • 2017-11-21
      • 2010-11-22
      相关资源
      最近更新 更多