Shinyjs не может правильно включить / отключить элемент пользовательского интерфейса - PullRequest
1 голос
/ 04 июля 2019

У меня ниже блестящего приложения

library(shiny)
runApp(shinyApp(
    ui = fluidPage(
        shinyjs::useShinyjs(),
       selectizeInput(inputId = "aaa", label = NULL, choices = c('a', 'b', 'c', 'd', 'e', 'f'), selected = NULL, width = '90%',
                         options = list(placeholder = 'Get', 
                                                onInitialize = I('function() { this.setValue(""); }'), maxItems = 5)),
       radioButtons("bbb", label = NULL, inline = TRUE, width = "100%", selected = 95,
                                                        choiceValues = list(1, 2, 3),
                                                        choiceNames = list(
                                                                            div(style = "font-size:24px;", "1%"), 
                                                                            div(style = "font-size:24px;", "2%"), 
                                                                            div(style = "font-size:24px;", "3%")
                                                                          ))
    ),
    server = function(input, output, session) {
        observeEvent(input$aaa, {
            if(grepl("a", input$aaa)){
                shinyjs::enable("bbb")
            }else{
                shinyjs::disable("bbb")
            }
        })
    }
))

Когда я выбираю a, b, c,, я получаю Radiobutton включенным, а теперь, если я удаляю все мои выборы, я все равно вижу, что они включены.Это странно для меня, потому что я ожидаю, что это будет отключено.Затем после удаления всего, если я сделаю новый выбор без a, он все равно останется включенным.

Может кто-нибудь показать мне указатель, что пошло не так?

1 Ответ

0 голосов
/ 04 июля 2019

Я сделал два изменения, и это работает почти так, как вы хотите: - Инициализировать радиокнопки как отключенные - Передать только один true / false в if

library(shiny)
library(shinyjs)
runApp(shinyApp(
  ui = fluidPage(
    shinyjs::useShinyjs(),
    selectizeInput(inputId = "aaa", label = NULL, choices = c('a', 'b', 'c', 'd', 'e', 'f'), selected = NULL, width = '90%',
                   options = list(placeholder = 'Get', 
                                  onInitialize = I('function() { this.setValue(""); }'), maxItems = 5)),
    shinyjs::disabled( # buttons disable at the launching
      radioButtons("bbb", label = NULL, inline = TRUE, width = "100%", selected = 95,
                   choiceValues = list(1, 2, 3),
                   choiceNames = list(
                     div(style = "font-size:24px;", "1%"), 
                     div(style = "font-size:24px;", "2%"), 
                     div(style = "font-size:24px;", "3%")
                   ))
    )

  ),
  server = function(input, output, session) {
    observeEvent(input$aaa, {
      # any(grepl(...)) returns TRUE if one of them is TRUE
      # just grepl(..) would return a vector of TRUE and FALSE
      if(any(grepl("a", input$aaa))){
        shinyjs::enable("bbb")
      }else{
        shinyjs::disable("bbb")
      }
    })
  }
))

Я не знаю, почему кнопки продолжают включаться, когда ничего не выбрано после выбора "a"

РЕДАКТИРОВАТЬ: похоже, что наблюдаемое событие не реагирует, когда вход имеет значение, тогда НЕДЕЙСТВИТЕЛЕН. Вместо того, чтобы использовать проблему, используйте наблюдение ().

library(shiny)
library(shinyjs)
runApp(shinyApp(
  ui = fluidPage(
    shinyjs::useShinyjs(),
    selectizeInput(inputId = "aaa", label = NULL, choices = c('a', 'b', 'c', 'd', 'e', 'f'), selected = NULL, width = '90%',
                   options = list(placeholder = 'Get', 
                                  onInitialize = I('function() { this.setValue(""); }'), maxItems = 5)),
    shinyjs::disabled(
      radioButtons("bbb", label = NULL, inline = TRUE, width = "100%", selected = 95,
                   choiceValues = list(1, 2, 3),
                   choiceNames = list(
                     div(style = "font-size:24px;", "1%"), 
                     div(style = "font-size:24px;", "2%"), 
                     div(style = "font-size:24px;", "3%")
                   ))
    )

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

    observe({
        if(any(grepl("a", input$aaa))){
          shinyjs::enable("bbb")
        }else{
          shinyjs::disable("bbb")
        }
      }
    )
  }
))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...