使用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)
用户界面