R Блестящие включения модулей с пользовательским интерфейсом и компонентом сервера в приложении - PullRequest
0 голосов
/ 27 февраля 2019

Мне интересно, можно ли позволить моим пользователям включать и выключать определенные модули в моем приложении.

Каждый из моих модулей функционально содержит один анализ и технически построен с использованием серверной и пользовательской функций.

Я бы хотел, чтобы пользователь выбрал те модули / анализы, которые он или она хотели бы просмотреть.

Я пытался (для тестирования) поместить их в оператор if else, который прослушивает вход выбора.

Наиболее распространенный пример такого приложения:

  ui <- dashboardPage(
      dashboardHeader(title = NULL),
      dashboardSidebar(
          width = '100%',
          disable  = TRUE
      ),
      dashboardBody(
          fluidRow(
              box(
                  title = "Modular modules", width = NULL, background = "blue",
                  h5(
                      paste('Version: ', packageVersion("modular modules"))
                  )
              )
          )
          fluidRow(
              pickerInput(inputId = 'select_modules',
                          label = 'Moules',
                          choices = c('Mod1', 'Mod2'),
                          selected = NULL,
                          multiple = FALSE)
          ),
          uiOutput('modulesUI'))
          )

          server <- function(input, output, session) {          

                observeEvent(input$select_modules,{
                    output$modulesUI <- renderUI(
                        if(input$select_modules == 'mod1'){
                        fluidRow(
                            mod1_UI(id = 'mod1')
                        )
                    } else if(input$select_modules == 'mod2'){
                        fluidRow(
                            mod2_UI(id = "mod2")
                        )
                    }
                    )
                })

            observeEvent(input$select_modules,{
                if(input$select_modules == 'mod1'){
                    callModule(mod1,
                               id = 'mod1',
                               ...
                                   )
                } else if(input$select_modules == 'mod2'){
                    callModule(mod2,
                               id = "mod2",
                              ...
                    )
                }
            })

Мои решения не работают.Можно ли это сделать?А если может, то как?

1 Ответ

0 голосов
/ 04 марта 2019

Я не знаю, что вы подразумеваете под «выключением» модуля, но что-то вроде этого работает как брелок:

Код

## Define 2 modules
module1_ui <- function(id) {
  ns <- NS(id)
  tagList(
    h3("Distribution"),
    sliderInput(ns("sld"), "n", 10, 100, 10),
    plotOutput(ns("pl"))
  )}

module1 <- function(input, output, session) {
  output$pl <- renderPlot(hist(rnorm(input$sld)))
}

module2_ui <- function(id) {
  ns <- NS(id)
  tagList(
    h3("Boxplot"),
    numericInput(ns("nui"), "n:"),
    plotOutput(ns("pl"))
  )}

module2 <- function(input, output, session) {
  output$pl <- renderPlot(boxplot(rnorm(input$nui)))
}


## in the main ui have a select input and a ui placeholder 
## to select which module to show and to render it
ui <- fluidPage(
  selectInput("mod", "Module:", c("Module 1", "Module 2")),
  uiOutput("mod_placeholder")
)

## in the server call the handlers either statically or dynamically
server <- function(input, output, session) {
  active_handler <- reactiveVal()

  observe({
    req(input$mod)
    if (input$mod == "Module 1") {
      active_handler(callModule(module1, "m1"))
    } else {
      active_handler(callModule(module2, "m2"))
    }
  })


  ## a static approach like this would also work
  ## handler <- list(mod1 = callModule(module1, "m1"),
  ##                 mod2 = callModule(module2, "m2")) 

  output$mod_placholder <- renderUI({
    if (input$mod == "Module 1") {
      module1_ui("m1")
    } else {
      module2_ui("m2")
    }
  })
}

shinyApp(ui, server)

Замечания

Этот игрушечный пример довольно жестко запрограммирован, поэтому в вашем случае использования я бы поместил все модули (пользовательский интерфейс и сервер) в список и перебрал этот список.Тогда добавить новый модуль довольно просто, так как вам нужно просто добавить сервер и функцию пользовательского интерфейса в этот список, а остальные обновятся автоматически.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...