R Shiny - Использование пользовательского обработчика сообщений для отключения одной радиокнопки в группе радиокнопок - PullRequest
0 голосов
/ 30 марта 2019

Приложение ниже содержит selectInput input$set1 с двумя параметрами (download и upload) и группу переключателей input$set2, отображаемую с использованием renderUI().Я использую пользовательский обработчик сообщений, который отключает переключатель в группе переключателей в зависимости от значения selectInput (если input$set1 == 'download', то отключите переключатель upload и включите его в противном случае).

Здесьэто приложение:

library(shiny)
library(shinyWidgets)
library(shinydashboard)

toggleRadioOpt <- function(session, inputId, choice, enable = TRUE, selected) {
  session$sendCustomMessage(
    type = 'toggleRadioOpt',
    message = list(id = inputId, choice = choice, enable = enable, selected = selected)
  )
}

modUI <- function(id) {

  ns <- NS(id)

  tagList(

    tags$head(
      tags$script("

                  Shiny.addCustomMessageHandler('toggleRadioOpt',
                  function(data) {
                  $('#' + data.id + ' input[value = \"' + data.choice + '\"]').attr('disabled', !data.enable).prop('checked', false);
    if(data.selected !== null) {
                  $('#' + data.id + ' input[value = \"' + data.selected + '\"]').prop('checked', true);
}
                  }
                  );

                  ")
      ),

    prettyRadioButtons(ns('set1'), label = 'Select', choices = c('download', 'upload', 'abb')),

    # selectInput(ns('set1'), label = 'Select', choices = c('download', 'upload', 'sql')),

    uiOutput(ns('taskUI'))

      )

}


modServer <- shinyServer(function(input, output, session) {
  ns = session$ns

  output$taskUI <- renderUI({

    switch(input$set1, 
           'download' = selectInput(ns('data'), '', state.area),
           'upload' = selectInput(ns('data'), '', state.center),
           'abb' = tagList(
             selectInput(ns('data'), '', state.abb), 
             actionButton(ns('upload'), 'Upload')
             )
           )

    prettyRadioButtons(ns('set2'), label = '', choices = c('split', 'upload'))

  })

  observe({

    if(!is.null(input$set2)) {

      if(input$set1 %in% c('download', 'abb')) {

        toggleRadioOpt(session = session, inputId = ns('set2'), choice = 'upload', enable = F, selected = 'split')

      } else {

        toggleRadioOpt(session = session, inputId = ns('set2'), choice = 'upload', enable = T, selected = 'split')

      }

    }

  })
})


# UI ----------------------------------------------------------------------
ui = fluidPage(modUI('first'))

# SERVER ------------------------------------------------------------------
server <- shinyServer(function(input, output, session) {

  callModule(modServer, 'first')  

})

shinyApp(ui, server)

Обработчик работает должным образом, если группа переключателей создается в пользовательском интерфейсе, но не работает, если кнопки создаются с помощью renderUI().В частности, он не запускается при запуске, но затем работает, если впоследствии изменяется input$set1.Я новичок в использовании пользовательских обработчиков сообщений, поэтому я не уверен, что здесь происходит или как это исправить.Я думал, что это может иметь какое-то отношение к запуску jQuery до загрузки интерфейса, но я не уверен.

1 Ответ

1 голос
/ 30 марта 2019

Я думал, что это может иметь какое-то отношение к запуску jQuery. до загрузки интерфейса, но я не уверен.

Я так думаю. Перед загрузкой пользовательского интерфейса input$set2 равно NULL. Вы можете сделать:

  observe({
    if(!is.null(input$set2)){
      if(input$set1 == 'download') {
        toggleRadioOpt(session = session, inputId = ns('set2'), choice = 'upload',
                       enable = F, selected = 'split')
      } else {
        toggleRadioOpt(session = session, inputId = ns('set2'), choice = 'upload', 
                       enable = T, selected = 'split')
      }
    }
  })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...