How do you create a progress bar when using the “foreach()” function in R?

前端 未结 7 1273
青春惊慌失措
青春惊慌失措 2020-11-28 03:41

there are some informative posts on how to create a counter for loops in an R program. However, how do you create a similar function when using the parallelized version wit

7条回答
  •  温柔的废话
    2020-11-28 04:18

    Edit: After an update to the doSNOW package it has become quite simple to display a nice progress bar when using %dopar% and it works on Linux, Windows and OS X

    doSNOW now officially supports progress bars via the .options.snow argument.

    library(doSNOW)
    cl <- makeCluster(2)
    registerDoSNOW(cl)
    iterations <- 100
    pb <- txtProgressBar(max = iterations, style = 3)
    progress <- function(n) setTxtProgressBar(pb, n)
    opts <- list(progress = progress)
    result <- foreach(i = 1:iterations, .combine = rbind, 
                      .options.snow = opts) %dopar%
    {
        s <- summary(rnorm(1e6))[3]
        return(s)
    }
    close(pb)
    stopCluster(cl) 
    

    Yet another way of tracking progress, if you keep in mind the total number of iterations, is to set .verbose = T as this will print to the console which iterations have been finished.

    Previous solution for Linux and OS X

    On Ubuntu 14.04 (64 bit) and OS X (El Capitan) the progress bar is displayed even when using %dopar% if in the makeCluster function oufile = "" is set. It does not seem to work under Windows. From the help on makeCluster:

    outfile: Where to direct the stdout and stderr connection output from the workers. "" indicates no redirection (which may only be useful for workers on the local machine). Defaults to ‘/dev/null’ (‘nul:’ on Windows).

    Example code:

    library(foreach)
    library(doSNOW)
    cl <- makeCluster(4, outfile="") # number of cores. Notice 'outfile'
    registerDoSNOW(cl)
    iterations <- 100
    pb <- txtProgressBar(min = 1, max = iterations, style = 3)
    result <- foreach(i = 1:iterations, .combine = rbind) %dopar% 
    {
          s <- summary(rnorm(1e6))[3]
          setTxtProgressBar(pb, i) 
          return(s)
    }
    close(pb)
    stopCluster(cl) 
    

    This is what the progress bar looks like. It looks a little odd since a new bar is printed for every progression of the bar and because a worker may lag a bit which causes the progress bar to go back and forth occasionally.

提交回复
热议问题