Как создать модуль для кода в блестящем? - PullRequest
0 голосов
/ 31 января 2020

У меня есть фрагмент кода, который будет неоднократно использоваться runbutton (как минимум два раза для демонстрационных данных и пользовательских данных). Мне интересно, как я могу записать это как модуль или функцию, чтобы вызвать его модульно.

... ({
        resdemo <- reactiveVal()
        voldemo <- reactiveVal()
        godemo <- reactiveVal()

        observeEvent(input$runbutton, {
          resdemo <- (NULL)
          voldemo <- (NULL)
          godemo <- (NULL)
          withProgress(message = 'Running...', style="old", value=0, {
            Sys.sleep(1)
            resdemo(getdgeres(ctdemo, pdemo,
                           comparison=input$design, 
                           level1=input$ref1,
                           level0=input$ref0))
            incProgress(0.4, detail="Differeital expression ... ")

            Sys.sleep(2)
            godemo(getgores(resdemo()[["results"]], species="Human"))
            incProgress(0.4, detail="Pahtway analysis ... ")

            Sys.sleep(3)
            voldemo(getvolcano(resdemo()[["results"]]))
            incProgress(0.2, detail="making plot ... ")
          })
        })
        todowndat <- reactive({
          switch(input$results,
                 "Results" = resdemo()[["results"]],
                 "Normalized matrix" = resdemo()[["normal"]]
          )
        })

        output$table <- renderTable({
          todowndat()
        })

        output$downloadData <- downloadHandler(
          filename = function() {
            paste(input$results, ".csv", sep = "")
          },
          content = function(file) {
            write.csv(todowndat(), file, row.names = FALSE)
          }
        ) 
        #tabPanel-Results
        output$plot1 <- renderPlot({
          voldemo()[["plot"]]
        })

        output$brush_info <- renderPrint({
          showdf<-voldemo()[["brush"]]%>%dplyr::select(Gene, log2FoldChange, pvalue, padj, log10padj) 
          brushedPoints(showdf, input$plot1_brush)
        })
})

1 Ответ

1 голос
/ 31 января 2020

Вы можете найти введение в блестящие модули здесь . В любом случае я бы собрал модуль с пустой функцией пользовательского интерфейса и включил бы ваш код, который многократно выполняется на стороне сервера модулей. Я приведу вам короткий пример использования модуля:

Поэтому я настроил один и тот же модуль (который показывает график) дважды. С помощью кнопки в основной части пользовательского интерфейса вы можете переключать график внутри модулей.

library(shiny)
library(ggplot2)

# module part
moduleUI <- function(id) {
  ns <- NS(id)
  # module UI things
  plotOutput(ns("module_plt"))
}

module <-  function(input, output, session, plt_toggle) {
  # the module server side
  output$module_plt <- renderPlot({
    if(plt_toggle$show_plt1) {
      ggplot(iris, aes(x=Sepal.Length, y=Sepal.Width)) + geom_point()
    } else {
      ggplot(iris, aes(x=Sepal.Length, y=Sepal.Width)) + geom_line()
    }
  })
}

# main ui
ui <- shinyUI(
  fluidPage(
    fluidRow(actionButton("switch_plt", "Switch Plot")),
    # call the module ui
    column(width=6, moduleUI("moduleID1")),
    column(width=6, moduleUI("moduleID2"))
  )
)

server <- shinyServer(function(input, output, session) {
  # initialize default plt
  plt_toggle <- reactiveValues(show_plt1=T, show_plt2=F)

  # which plt is active
  observeEvent(input$switch_plt, {
    if(plt_toggle$show_plt1){
      plt_toggle$show_plt1 <- F
      plt_toggle$show_plt2 <- T
    } else {
      plt_toggle$show_plt1 <- T
      plt_toggle$show_plt2 <- F
    }
  })
  # add the modules
  callModule(module, "moduleID1", plt_toggle)
  callModule(module, "moduleID2", plt_toggle)
})

shinyApp(ui, server)

В вашем случае вам необходимо передать значения reactive, необходимые в модуле, функции сервера модуля , Я рекомендую source, чтобы модуль работал в отдельных файлах, чтобы ваш код был чистым.

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