说我有以下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;通过使用uiOutput
和renderUI
(基于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 />
答案 0 :(得分:12)
如果你使用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)
修改原始代码所需要做的就是添加对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)