R 来自全局变量的进度条

R 来自全局变量的进度条,r,shiny,progress-bar,R,Shiny,Progress Bar,我有一个自定义函数库,我需要在一个闪亮的应用程序中使用它。这个函数内部有一个for循环,我想使用该循环中的变量来更新进度条(而不是将函数复制到服务器文件,因为我想保持所有内容的独立和干净)。到目前为止,我已经设法在函数使用“withProgress()”运行时弹出一条消息,但我想让它更好地显示已完成作业的百分比,这样最终用户就不会垃圾邮件发送“运行”按钮。 这是一个可重现的问题示例: library(shiny) # Library in separate file snail_functio

我有一个自定义函数库,我需要在一个闪亮的应用程序中使用它。这个函数内部有一个for循环,我想使用该循环中的变量来更新进度条(而不是将函数复制到服务器文件,因为我想保持所有内容的独立和干净)。到目前为止,我已经设法在函数使用“withProgress()”运行时弹出一条消息,但我想让它更好地显示已完成作业的百分比,这样最终用户就不会垃圾邮件发送“运行”按钮。 这是一个可重现的问题示例:

library(shiny)

# Library in separate file
snail_function <- function(){
  for (i in 1:100){
    Sys.sleep(1)
  }
}

# ui.R
ui <- shinyUI(fluidPage(
  tabsetPanel(
    tabPanel("1. Load Files"
           , fluidRow(actionButton("analysis", "Run analysis"))
           , fluidRow(
               plotOutput("bar")
             )
           )

    )
))

# server.R
server <- shinyServer(function(input, output, session) {
  observeEvent(input$analysis, {     
    output$bar <- renderPlot({
      withProgress(message = 'Running... (this may take a while)',
                   detail = 'Go get some coffee...', value = 0, {
                     snail_function()
                   })
      # do stuff
    })

  })

})

shinyApp(ui = ui, server = server)
库(闪亮)
#独立文件中的库

snail_函数保持干净解决方案的一种可能性是在函数中添加一个参数
progress
,该参数指示我们是否要增加进度,并且仅当该参数设置为
TRUE
时才调用
incProgress
。因此,当我们想独立运行此函数时,可以将其称为
snail\u函数(FALSE)
。下面显示了一个工作示例,希望对您有所帮助


库(闪亮)
#独立文件中的库
蜗牛函数
library(shiny)

# Library in separate file
snail_function <- function(progress=FALSE){
  for (i in 1:100){
    Sys.sleep(1)
    if(progress)
      incProgress(1/100)
  }
}

# ui.R
ui <- shinyUI(fluidPage(
  tabsetPanel(
    tabPanel("1. Load Files"
             , fluidRow(actionButton("analysis", "Run analysis"))
             , fluidRow(
               plotOutput("bar")
             )
    )

  )
))

# server.R
server <- shinyServer(function(input, output, session) {
  observeEvent(input$analysis, {     
    output$bar <- renderPlot({
      withProgress(message = 'Running... (this may take a while)',
                   detail = 'Go get some coffee...', value = 0, {
                     snail_function(progress=TRUE)
                   })
      # do stuff
    })

  })

})

shinyApp(ui,server)