2015-06-14 6 views
4

Say У меня есть следующая Блестящая App:Отключить TextInput на основе выбора кнопки радио на 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, используя 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 /> 

ответ

2

Вы можете сделать это с session$sendCustomMessage на сервере (который генерирует JavaScript который отключает или разрешает текстовое поле) и 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) 
10

Такого рода вещи на самом деле очень тривиальный, если вы используете 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

Смежные вопросы