The aurrera package makes adding a progress bar easy. Inspired by tqdm
Python package, a progress bar is just a
single function call away. Wrap the object you iterate on with
aurrrera::pb()
and use it in most iterators like lapply()
.
If you need a fine control over your progress bars, use progressr package instead.
You can install the development version of aurrera from GitHub with:
# install.packages("devtools")
devtools::install_github("turtletopia/aurrera")
Suppose we have some slowly processing function and a vector we want to apply this function to:
library(aurrera)
slow_paste <- function(...) {
Sys.sleep(.2)
paste(..., collapse = "")
}
x <- lapply(seq(3), function(i) sample(letters, 4))
This is the usual call you’d make:
lapply(x, slow_paste)
#> [[1]]
#> [1] "pshz"
#>
#> [[2]]
#> [1] "ufmd"
#>
#> [[3]]
#> [1] "pqrl"
To add a progress bar, simply wrap x
in pb()
:
lapply(pb(x), slow_paste)
#> ================================================================================
#> [[1]]
#> [1] "pshz"
#>
#> [[2]]
#> [1] "ufmd"
#>
#> [[3]]
#> [1] "pqrl"
These are some of the other iterators you can use aurrera with:
sapply(pb(x), slow_paste)
#> ================================================================================
#> [1] "pshz" "ufmd" "pqrl"
purrr::map_chr(pb(x), slow_paste)
#> ================================================================================
#> [1] "pshz" "ufmd" "pqrl"
parallel::mclapply(pb(x), slow_paste)
#> ================================================================================
#> [[1]]
#> [1] "pshz"
#>
#> [[2]]
#> [1] "ufmd"
#>
#> [[3]]
#> [1] "pqrl"
plyr::llply(pb(x), slow_paste)
#> ================================================================================
#> [[1]]
#> [1] "pshz"
#>
#> [[2]]
#> [1] "ufmd"
#>
#> [[3]]
#> [1] "pqrl"
Reduce(slow_paste, pb(x))
#> ================================================================================
#> [1] "p us fh mz d pp us fh mz d qp us fh mz d rp us fh mz d l"
purrr::reduce(pb(x), slow_paste)
#> ================================================================================
#> [1] "p us fh mz d pp us fh mz d qp us fh mz d rp us fh mz d l"
library(foreach)
foreach::foreach(el = pb(x)) %do% slow_paste(el)
#> ================================================================================
#> [[1]]
#> [1] "pshz"
#>
#> [[2]]
#> [1] "ufmd"
#>
#> [[3]]
#> [1] "pqrl"
However, progress bars do not appear when using the old plain for
loop… unless you make the iteration manually:
x_pb <- pb(x)
v <- character()
for (i in seq_along(x_pb)) {
# Pretend the operation below makes sense
v <- c(slow_paste(x_pb[[i]]), v)
}
#> ================================================================================
v
#> [1] "pqrl" "ufmd" "pshz"
- Progress bars do not appear when iterating within
for
loop, i.e.for (el in pb(iterable))
. Use manual iteration instead (as presented above).
I believe in equal rights and treatment for everybody, regardless of their sexuality, gender identity, skin tone, nationality, and other features beyond human control. Thus, I do not allow gglgbtq to be used in any project that promotes hate based on the aforementioned factors.