闪亮的进度条过早出现

时间:2016-09-06 11:29:58

标签: shiny progress-bar

我正在尝试使用进度条(通过命令'withProgress')来监视我在闪亮运行的管道的完成情况。

有6个进度条。通过上传文件并随后单击“actionButton”(inputId = action)来启动管道。但是,在我上传文件之前,有3个进度条暂时出现。然后当我运行管道时,它们以错误的顺序出现,即应该是第一个出现在第二个等等。

任何人都可以告诉我为什么会发生这种情况以及如何纠正它? 下面是管道的样子:

#ui.R
shinyUI(fluidPage(
  titlePanel("Uploading Files"),
  sidebarLayout(
    sidebarPanel(
      fileInput('file1', 'Choose CSV File',
                accept=c('text/csv', 
                                 'text/comma-separated-values,text/plain', 
                                 '.csv')),
      tags$hr(),
      checkboxInput('header', 'Header', TRUE),
      radioButtons('sep', 'Separator',
                   c(Comma=',',
                     Semicolon=';',
                     Tab='\t'),
                   ','),
      radioButtons('quote', 'Quote',
                   c(None='',
                     'Double Quote'='"',
                     'Single Quote'="'"),
                   '"')
    ),
    mainPanel(
      plotOutput('plot')
    )
  )
))


#server.R
server <- function(input, output, session) {
  read <- reactive({
  dataInput <- eventReactive(input$action{
    inFile <- input$file1
    if (is.null(inFile))
      return(NULL)
    isolate(file<-read.csv(inFile$datapath, header = input$header,
                       sep = input$sep))
    file
  })
  file_data_manipulated<-reactive({
                withProgress(message = 'Please Wait',
                 detail = 'This may take a while...', value = 0, {
                   for (i in 1:15) {
                     incProgress(1/15)
                     Sys.sleep(0.25)
                   }
                as.numeric(dataInput())
                   })
                })
  output$plot<-renderPlot({
    withProgress(message = 'Please Wait',
                 detail = 'This may take a while...', value = 0, {
                   for (i in 1:15) {
                     incProgress(1/15)
                     Sys.sleep(0.25)
                   }
                   plot(file_data_manipulated(), main = "Sample clustering to detect outliers", sub="", xlab="", cex.lab = 1.5, cex.axis = 1.5, cex.main = 2)
                   abline(h = input$cutoff_filter, col = "red")
                   #legend("bottomleft", scc$csize>1, pt.bg=unique(node_colors), pch=21)
                 })

  })

1 个答案:

答案 0 :(得分:1)

我认为您的代码不完整。之前出现进度条,因为只要调用服务器函数,反应函数内的所有代码都将被执行,您需要提供控制何时显示进度条的机制。在这种情况下,只需检查文件是否已使用if正确上传就足够了。

我修改了你的代码以显示如何控制反应函数。由于我不知道您的输入文件是什么,我只是绘制一些基本数据。另外,我不知道你是如何使用read <- reactive({的,所以只是删除它。

library(shiny)

ui <- shinyUI(fluidPage(
  titlePanel("Uploading Files"),
  sidebarLayout(
    sidebarPanel(
      fileInput('file1', 'Choose CSV File',
                accept=c('text/csv', 
                                 'text/comma-separated-values,text/plain', 
                                 '.csv')),
      tags$hr(),
      checkboxInput('header', 'Header', TRUE),
      radioButtons('sep', 'Separator',
                   c(Comma=',',
                     Semicolon=';',
                     Tab='\t'),
                   ','),
      radioButtons('quote', 'Quote',
                   c(None='',
                     'Double Quote'='"',
                     'Single Quote'="'"),
                   '"'),
      br(),
      actionButton('action', 'action')
    ),
    mainPanel(
      plotOutput('plot')
    )
  )
))

server <- function(input, output, session) {
  dataInput <- eventReactive(input$action, {
    inFile <- input$file1
    if (is.null(inFile))
      return(NULL)
    isolate({
      file <- read.csv(inFile$datapath, header = input$header,
                       sep = input$sep)
    })
    file
  })
  file_data_manipulated <- reactive({
    input$action
    if (is.null(dataInput()))
      return(NULL)
    withProgress(message = 'Please Wait 1',
      detail = 'This may take a while...', value = 0, {
        for (i in 1:15) {
           incProgress(1/15)
           Sys.sleep(0.25)
        }
        as.numeric(dataInput())
      })
  })
  output$plot <- renderPlot({
    input$action
    if (is.null(dataInput()))
      return(NULL)
    withProgress(message = 'Please Wait 2',
      detail = 'This may take a while...', value = 0, {
        for (i in 1:15) {
          incProgress(1/15)
          Sys.sleep(0.25)
        }
        # plot(file_data_manipulated(), main = "Sample clustering to detect outliers", 
          # sub="", xlab="", cex.lab = 1.5, cex.axis = 1.5, cex.main = 2)
        # abline(h = input$cutoff_filter, col = "red")
        #legend("bottomleft", scc$csize>1, pt.bg=unique(node_colors), pch=21)
        plot(sin, -pi, 2*pi)
      })
  })
}

runApp(list(ui = ui, server = server))