2016-08-18 2 views
0

Мне нужно ограничить возможность пользователя выбирать переключатели, но показывать их всегда. Я использую shinyjs::disable, чтобы отключить кнопку и updateRadioButtons, чтобы обновить выбор, но он работает некорректно. Только, кажется, работает, не отключая Мой код обновления:Использование блестящих updateRadioButtons с shinyjs отключить/включить

library(shiny) 
library(shinyjs) 

server = shinyServer(function(input, output, session) { 

observeEvent(input$toggle, { 

if (input$toggle == "enable") { 

    updateRadioButtons(session, "button1", "", 
        c("one" = "one", "two" = "two"), 
        inline = T, selected = "one") 

    shinyjs::enable("button1") 

} 

if (input$toggle == "disable") { 

    updateRadioButtons(session, "button1", "", 
        c("one" = "one", "two" = "two"), 
        inline = T, selected = "two") 

    shinyjs::disable("button1") 

} 

}) 

}) 

ui = shinyUI(

fluidPage(

shinyjs::useShinyjs(), 

radioButtons("toggle", "", 
      c("enable" = "enable", "disable" = "disable"), inline = T), 

radioButtons("button1", "", 
      c("one" = "one", "two" = "two"), inline = T) 

)) 

shinyApp(ui=ui,server=server) 

ответ

1

Это происходит потому, что функция обновления фактически делает обновление немного позже. Так что происходит то, что вызывается функция обновления, затем вызывается функция disable, кнопка отключается, а чуть позже кнопка повторно создается из обновления. Это из-за того, как внутренние работы блестящей работы. Если вы закомментируете функцию обновления, вы увидите, что кнопка отключена. Это немного раздражает, но это просто побочный эффект того, как блестящие работы. Одно хакерское решение, которое вы можете попробовать, вместо disable(id), используйте shinyjs::delay(100, disable(id)) (это означает, что вы добавите короткую задержку в 100 мс и только затем отключите).