Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/r-lib/progress
Progress bar in your R terminal
https://github.com/r-lib/progress
r
Last synced: 7 days ago
JSON representation
Progress bar in your R terminal
- Host: GitHub
- URL: https://github.com/r-lib/progress
- Owner: r-lib
- License: other
- Created: 2014-10-03T20:14:56.000Z (over 10 years ago)
- Default Branch: main
- Last Pushed: 2024-11-09T13:56:22.000Z (2 months ago)
- Last Synced: 2024-12-29T04:00:27.888Z (14 days ago)
- Topics: r
- Language: R
- Homepage: http://r-lib.github.io/progress/
- Size: 4.72 MB
- Stars: 471
- Watchers: 9
- Forks: 40
- Open Issues: 12
-
Metadata Files:
- Readme: README.md
- Changelog: NEWS.md
- License: LICENSE
- Code of conduct: .github/CODE_OF_CONDUCT.md
Awesome Lists containing this project
- jimsghstars - r-lib/progress - Progress bar in your R terminal (R)
README
[![R-CMD-check](https://github.com/r-lib/progress/actions/workflows/R-CMD-check.yaml/badge.svg)](https://github.com/r-lib/progress/actions/workflows/R-CMD-check.yaml)
[![](https://www.r-pkg.org/badges/version/progress)](https://r-pkg.org/pkg/progress)
[![Codecov test coverage](https://codecov.io/gh/r-lib/progress/graph/badge.svg)](https://app.codecov.io/gh/r-lib/progress)> Progress bar in your R terminal
An R package to show ASCII progress bars. Heavily influenced by
the https://github.com/tj/node-progress JavaScript project.## Installation
Install the package from CRAN:
```r
install.packages("progress")
```If you need the development version, install it from GitHub:
```r
pak::pak("r-lib/progress")
```## Usage
Use the `progress_bar` R6 class:
```r
library(progress)
pb <- progress_bar$new(total = 100)
for (i in 1:100) {
pb$tick()
Sys.sleep(1 / 100)
}
``````
[==========================================================-------------] 81%
```The progress bar is displayed after the first `tick` command.
This might not be desirable for long computations, because
nothing is shown before the first tick. It is good practice to
call `tick(0)` at the beginning of the computation or download,
which shows the progress bar immediately.```r
pb <- progress_bar$new(total = 100)
f <- function() {
pb$tick(0)
Sys.sleep(3)
for (i in 1:100) {
pb$tick()
Sys.sleep(1 / 100)
}
}
f()
```Custom format, with estimated time of completion:
```r
pb <- progress_bar$new(
format = " downloading [:bar] :percent eta: :eta",
total = 100, clear = FALSE, width= 60)
for (i in 1:100) {
pb$tick()
Sys.sleep(1 / 100)
}
``````
downloading [========----------------------] 28% eta: 1s
```With elapsed time:
```r
pb <- progress_bar$new(
format = " downloading [:bar] :percent in :elapsed",
total = 100, clear = FALSE, width= 60)
for (i in 1:100) {
pb$tick()
Sys.sleep(1 / 100)
}
``````
downloading [==========================------] 80% in 1s
``````r
pb <- progress_bar$new(
format = " downloading [:bar] :elapsedfull",
total = 1000, clear = FALSE, width= 60)
for (i in 1:1000) {
pb$tick()
Sys.sleep(1 / 100)
}
``````
downloading [=====================--------------] 00:00:08
```With number of number of ticks/total:
```r
total <- 1000
pb <- progress_bar$new(format = "[:bar] :current/:total (:percent)", total = total)
f <- function() {
pb$tick(0)
Sys.sleep(3)
for (i in 1:total) {
pb$tick(1)
Sys.sleep(1 / 100)
}
}
f()
``````
[============================-------------------------------------------------] 370/1000 ( 37%)
```With custom tokens:
```r
pb <- progress_bar$new(
format = " downloading :what [:bar] :percent eta: :eta",
clear = FALSE, total = 200, width = 60)
f <- function() {
for (i in 1:100) {
pb$tick(tokens = list(what = "foo "))
Sys.sleep(2 / 100)
}
for (i in 1:100) {
pb$tick(tokens = list(what = "foobar"))
Sys.sleep(2 / 100)
}
}
f()
``````
downloading foo [======------------------] 27% eta: 4s
```It can show download rates for files with unknown sizes:
```r
pb <- progress_bar$new(
format = " downloading foobar at :rate, got :bytes in :elapsed",
clear = FALSE, total = 1e7, width = 60)
f <- function() {
for (i in 1:100) {
pb$tick(sample(1:100 * 1000, 1))
Sys.sleep(2/100)
}
pb$tick(1e7)
invisible()
}
f()
``````
downloading foobar at 5.42 MB/s, got 15.45 MB in 3s
```Progress bars can also digress, by supplying negative values to `tick()`:
```r
pb <- progress_bar$new()
f <- function() {
pb$tick(50) ; Sys.sleep(1)
pb$tick(-20) ; Sys.sleep(1)
pb$tick(50) ; Sys.sleep(1)
pb$tick(-30) ; Sys.sleep(1)
pb$tick(100)
}
f()
```See the manual for details and other options.
## Usage with `purrr` iterators
If you prefer to do your iterative tasks using the `purrr` family of functional programming tools, rather than with `for` loops, there are two straightforward ways to add progress bars:
1. Increment the ticks *in-line* when calling the `purrr` iterator.
2. Define the task and increment the ticks in a separate wrapper function.
***Option 1*** is concise for simple one-line tasks (*e.g.* requiring only a single function call), while ***Option 2*** is probably preferred for more complex multi-line tasks.
```r
# Option 1
pb <- progress_bar$new(total = 100)
purrr::walk(1:100, ~{pb$tick(); Sys.sleep(0.1)})
```
```
[================================================>------] 89%
``````r
# Option 2
pb <- progress_bar$new(total = 100)foo <- function(x){
pb$tick()
Sys.sleep(0.1)
}purrr::walk(1:100, foo)
```
```
[==================>------------------------------------] 34%
```## Creating a plyr compatible progress bar
It is easy to create progress bars for
[plyr](https://github.com/hadley/plyr):```r
progress_progress <- function(...) {
pb <- NULL
list(
init = function(x, ...) {
pb <<- progress_bar$new(total = x, ...)
},
step = function() {
pb$tick()
},
term = function() NULL
)
}
```You can try it with
```r
plyr::l_ply(
1:100,
.fun = function(...) Sys.sleep(0.01),
.progress = 'progress'
)
```## C++ API
The package also provides a C++ API, that can be used with or
without Rcpp. See [the example package](tests/testthat/progresstest/src/test.cpp) that
is [included](tests/testthat/progresstest) within `progress`. Here is a short excerpt
that shows how it works:```CPP
#include
...
RProgress::RProgress pb("Downloading [:bar] ETA: :eta");
pb.tick(0);
for (int i = 0; i < 100; i++) {
usleep(2.0 / 100 * 1000000);
pb.tick();
}...
```
The C++ API has almost the same functionality as the R API, except that it
does not currently support custom tokens, custom streams, and callback functions.Note that the C++ and the R APIs are independent and for a
single progress bar you need to use either one exclusively.## License
MIT @ [Gábor Csárdi](https://github.com/gaborcsardi),
[RStudio Inc](https://github.com/rstudio)