使用futures时,R-Shining应用程序无法正确更新进度条

使用futures时,R-Shining应用程序无法正确更新进度条,r,shiny,progress-bar,ipc,future,R,Shiny,Progress Bar,Ipc,Future,我有一个闪亮的应用程序,可以在多核上运行计算,同时通过进度条提供反馈。只要我不进一步处理未来的结果,这就行了(参见下面的工作示例)。一旦我使用结果之后,进度条不会更新,直到所有期货完成 我使用包future、promises和ipc进行进程间通信。我认为问题在于,一旦结果出来,R希望继续与期货公司合作。我试图用resolved()或resolve()等命令停止算法,但没有任何进展 library(shiny) library(future) library(promises) library(i

我有一个闪亮的应用程序,可以在多核上运行计算,同时通过进度条提供反馈。只要我不进一步处理未来的结果,这就行了(参见下面的工作示例)。一旦我使用结果之后,进度条不会更新,直到所有期货完成

我使用包
future
promises
ipc
进行进程间通信。我认为问题在于,一旦结果出来,R希望继续与期货公司合作。我试图用resolved()或resolve()等命令停止算法,但没有任何进展

library(shiny)
library(future)
library(promises)
library(ipc)

plan(list(multiprocess, sequential))

ui <- fluidPage(
    actionButton(inputId = "go", label = "Launch calculation")
)

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

    observeEvent(input$go, {
        x <- list()
        N = availableCores()
        Tasks = rep(10, N) #Number of sequential tasks per core

        progress = list() #A list to maintain progress for each run

        resultsvec <- c()
        for(j in 1:N){

            progress[[j]] = AsyncProgress$new(message = paste("analysis, core ",j))

            x[[j]] <- future({
                for(l in 1:Tasks[j]){
                    progress[[j]]$inc(1/Tasks[j])
                    resultsvec <- append(resultsvec, l)
                    Sys.sleep(1)
                }
                resultsvec
                progress[[j]]$close()
            })
        }
        result <- lapply(x, value)
        #... do stuff with result
    })
}

shinyApp(ui = ui, server = server)
库(闪亮)
图书馆(未来)
图书馆(承诺)
图书馆(ipc)
计划(列表(多进程、顺序))

ui我设法解决了我需要的问题,尽管解决方案不再使用期货。我切换到
doSNOW
软件包。但据我所知,除了允许进程间通信的
future/promises
之外,在
doSNOW
或其他并行包中没有其他选项。这就是我的解决办法。我在整个过程中使用了一个进度条,与上面的相反

library(shiny)
library(doSNOW)

ui <- fluidPage(
    actionButton(inputId = "go", label = "Launch calculation")
)

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

    observeEvent(input$go, {

        Tasks <- 40 #now total tasks to do
        runs <- 10 #splitting of progress bar. 10 means every 10% it gets updated. 20 every 5% etc.

        taskvec <- rep(Tasks %/% runs, runs)

        if (Tasks %% runs != 0){
            taskvec[1:(Tasks %% runs)] <- taskvec[1:(Tasks %% runs)] + 1
        }

        resultsvec <- c()

        cl <- makeCluster(2)
        registerDoSNOW(cl)

        withProgress(message = "Analysis", value = 0,{
            for (j in 1:runs) {

                resultsvec_sub <- foreach(i = 1:taskvec[j], 
                                          .combine = append) %dopar% {
                                              f <- i
                                              Sys.sleep(1)
                                              return(f)
                                          }
                resultsvec <- append(resultsvec, resultsvec_sub)
                incProgress(1/runs)
            }
        })
        stopCluster(cl)
        #do stuff with resultsvec..
    })
}

shinyApp(ui = ui, server = server)
库(闪亮)
图书馆(doSNOW)

ui我设法解决了我需要的问题,尽管解决方案不再使用期货。我切换到
doSNOW
软件包。但据我所知,除了允许进程间通信的
future/promises
之外,在
doSNOW
或其他并行包中没有其他选项。这就是我的解决办法。我在整个过程中使用了一个进度条,与上面的相反

library(shiny)
library(doSNOW)

ui <- fluidPage(
    actionButton(inputId = "go", label = "Launch calculation")
)

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

    observeEvent(input$go, {

        Tasks <- 40 #now total tasks to do
        runs <- 10 #splitting of progress bar. 10 means every 10% it gets updated. 20 every 5% etc.

        taskvec <- rep(Tasks %/% runs, runs)

        if (Tasks %% runs != 0){
            taskvec[1:(Tasks %% runs)] <- taskvec[1:(Tasks %% runs)] + 1
        }

        resultsvec <- c()

        cl <- makeCluster(2)
        registerDoSNOW(cl)

        withProgress(message = "Analysis", value = 0,{
            for (j in 1:runs) {

                resultsvec_sub <- foreach(i = 1:taskvec[j], 
                                          .combine = append) %dopar% {
                                              f <- i
                                              Sys.sleep(1)
                                              return(f)
                                          }
                resultsvec <- append(resultsvec, resultsvec_sub)
                incProgress(1/runs)
            }
        })
        stopCluster(cl)
        #do stuff with resultsvec..
    })
}

shinyApp(ui = ui, server = server)
库(闪亮)
图书馆(doSNOW)
用户界面