根据 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",使用 uiOutput
和renderUI
(基于 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
包,这种东西实际上是非常微不足道的 - 它的构建正是因为这些问题经常出现。有一些叫做 disable
和 enable
的函数,你可以在你的服务器中调用它们来 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
包
假设我有以下闪亮的应用程序:
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",使用 uiOutput
和renderUI
(基于 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
包,这种东西实际上是非常微不足道的 - 它的构建正是因为这些问题经常出现。有一些叫做 disable
和 enable
的函数,你可以在你的服务器中调用它们来 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
包