显示一条消息,直到加载所有包

Display a message till all the packages are loaded

我已经使用闪亮的服务器在我的服务器上部署了一个闪亮的应用程序。示例如下所示:

ui.R

#library(shinyjs)
library(shiny)

#filenames <- list.files(path = "data",pattern="\.csv$")
#names(filenames) <- gsub(pattern = "\.csv$", "", filenames)
shinyUI(fluidPage(
  titlePanel(
    headerPanel( 
      h3("Testing....",
         align="center", style="bold")
      )
    ),
  br(),
  br(),
  #useShinyjs(),  ## initialize shinyjs to reset input files.
  sidebarLayout(
    sidebarPanel(
      h5("Upload Data Files",style="bold"),
      fileInput("files", 
                "Choose CSV/txt processed files or raw files",
                multiple = "TRUE",
                accept=c('text/csv',
'text/comma-separated-values,
text/plain', '.csv','.cel','.TXT','.txt')),
#selectInput('dataset',"Choose platform annotation file", c("Please select a file" ='',filenames)),
fluidRow(
  column(5,
         radioButtons("radio", label = h5("Data uploaded"),
                      choices = list("Affymetrix" = 1, "Codelink" = 2,
                                     "Illumina" = 3),selected = NULL)
         )
  ),
fluidRow(
  column(10,
         h5("Differential Expression Call", style = "bold"),
         checkboxInput("checkbox",
                       label = "Differential Expression", value = FALSE))),
br(),
uiOutput('AnnotationFile')),
mainPanel(                      
  tabsetPanel(id = "MamgedTabs",
              tabPanel("Source-data", dataTableOutput("sourced")),
              tabPanel("Annotation-data",dataTableOutput("annotation"))
              )
  )
)
)
)

server.R

#library(gcrma)
#library(hgu133a.db)
#library(hgu133acdf)
#library(hgu133plus2.db)
#library(hgu133plus2cdf)
#library(hgu133a2frmavecs)
#library(hgu133b.db)
#library(hgu133bcdf)
#library(hgu219.db)
#library(hgu219cdf)
#library(hgu95a.db)
#library(hgu95acdf)
#library(org.Hs.eg.db)
#library(hgu133a2.db)
#library(hgu133a2cdf)
#library(hgu95av2.db)
#library(hgu95av2cdf)
#library(hgu133plus2cdf)
#library(affyPLM)
##library(makecdfenv)
#library(parallel)
#library(base)
#library(S4Vectors)
#library(IRanges)
#library(stats4)
#library(BiocInstaller)
#library(Biobase)
#library(BiocGenerics)
#library(BiocParallel)
#library(biomaRt)
#library(Biostrings)
#library(preprocessCore)
#library(affyio)
#library(zlibbioc)
#library(graphics)
#library(grDevices)
#library(methods)
#library(genefilter)
#library(stats)
#library(AnnotationDbi)
#library(utils)


## Defining the size of file to be accepted. Here it can accept any size.
options(shiny.maxRequestSize= -1) 

shinyServer(function(input, output,session) {
  filenames <- list.files(path = "data", pattern="\.txt$")
  names(filenames) <- gsub(pattern = "\.txt$", "", filenames)


  ## Dropdown box for chosing and loading annotation file
  output$AnnotationFile = renderUI({
    if(!input$checkbox | (input$checkbox == T && input$radio != 2)){
      wellPanel(
        h5("Upload Annotation File"),
        selectInput('dataset', "Choose platform annotation file",
                    c("Please select a file" = '', filenames), multiple = TRUE))
    }
  })
})

如您在 server.R 中看到的,我需要加载很多包,这需要一些时间。下面的代码

output$AnnotationFile = renderUI({
    if(!input$checkbox | (input$checkbox == T && input$radio != 2)){
      wellPanel(
        h5("Upload Annotation File"),
        selectInput('dataset', "Choose platform annotation file",
                    c("Please select a file" = '', filenames), multiple = TRUE))
    }
  })

是显示是隐藏的东西,需要一些时间才能显示,因为加载包需要时间,但有时根本不显示。

1) 我的应用程序在本地运行良好,但在部署到服务器上时显示此行为。有什么原因吗?

2) 如何在主面板上显示应用程序准备就绪直到它加载所有包的消息。

编辑: 我可以在 shinyServer() 中显示消息,但这是针对每个会话的(将一次又一次地加载所有包),但是我想显示和在应用程序开始时加载所有包。换句话说就是在shinyServer()

之外如何显示进度信息

也许进度指示器或模态对话框是您想要的?

更新 2

这里详细介绍了使用进度条读取包含 30 个 R 包的文本文件,每行一个:

# server.R
options(shiny.maxRequestSize = -1)
shinyServer(function(input, output, session) {
  withProgress(message = "Please wait", value = 0, expr = {
    for (i in 1:30) {
      source(textConnection(readLines("packages.txt", warn = FALSE)[i]))
      incProgress(amount = 1/30, detail = paste0("Loading package ", i, "/30"))
      Sys.sleep(time = 0.1)
    }
  })

  filenames <- list.files(path = "data", pattern = "\.txt$")
  names(filenames) <- gsub(pattern = "\.txt$", "", filenames)

  output$AnnotationFile <- renderUI({
    if (!input$checkbox | (input$checkbox == T && input$radio != 2)) {
      wellPanel(
        h5("Upload Annotation File"),
        selectInput('dataset', "Choose platform annotation file", c("Please select a file" = '', filenames), multiple = TRUE)
      )
    }
  })
})

如果你想让你的应用程序等到所有的包都加载完,你只需要把所有的包都放在ui.R中,原因很简单,因为ui.R之前已经被执行了server.R。所以你可以把所有的包放在ui.R的最前面。当应用程序启动时,它会加载所有包,然后向您显示您在 ui.R 中编写的界面,例如

#library(gcrma)
#library(hgu133a.db)
#library(hgu133acdf)

shinyUI(fluidPage(
# your code...
)
)

当您在 server.R 中使用包时,它会显示应用程序(ui.R 部分),但在内部它会加载所有包,这将需要一些时间,用户可能不知道,最终可能会导致对应用程序的工作感到困惑。为避免 ui.R 是一个不错的选择。