Using progress bars in R scripts can provide valuable timing feedback during development and additional polish to final products. winProgressBar
and setWinProgressBar
are the primary functions for creating progress bars in R.
Progress bars, and progress indicators in general, are relatively uncommon in R programming. This makes sense, as they can add bloat and, being design elements, they generally fall into the classification of “nice but not necessary”. However, during development, especially when using loops, progress bars can a cleaner way of tracking loop progress than, for example, printing iteration numbers. And for programmers who prepare scripts or packages for non-programmers, they add feedback that users have come to expect from other software.
To add progress bars in R scripts use the winProgressBar
and setWinProgressBar
functions. For non-Windows users there’s also a very similar Tcl/Tk version (tkProgressBar
and settkProgressbar
); depending on your current set up, you may need to install the tcltk library to use it.
Setting up a progress indicator to track the progress of a loop is very straightforward. First, initialize the display:
pb <- winProgressBar(title="Example progress bar", label="0% done", min=0, max=100, initial=0)
Use the title
and label
options to set the style of the display. The min
and max
options should use whatever values are most applicable to your task, but in most cases this will be displaying a percentage so a range of 0 to 100, starting at 0, makes sense.
After initializing the progress indicator, add your loop code and update the progress bar by calling the setWinProgressBar
function at the end of each loop:
for(i in 1:100) {
Sys.sleep(0.1) # slow down the code for illustration purposes
info <- sprintf("%d%% done", round((i/100)*100))
setWinProgressBar(pb, i/(100)*100, label=info)
} Once the loop is exited, close the progress bar window: close(pb)
Here is a snapshot of the progress indicator in action:
To track the progress of an entire script or program, you just need to place the initializing function (winProgressBar
) at the beginning of the code and do updates via setWinProgressBar
at key points within the flow of your program. For example, if the first task your code performs usually takes about 10% of the total time required, set the value to 10% after that task completes.
If a popup progress bar doesn’t work for your task, there is a minimalist option, txtProgressBar
, that by default draws a line in the console. It also allows for some fun customizations:
Thanks for this, this is great! Quick question – will this work if the loop received strings rather than values? I’m performing a loop of a few hundred files (extracting from each one the same thing) so the loop does not receive i in 1:100, it receives a series of file names. I wasn’t sure if the progress bar relies on the values of the loop or if it’s able to track the progress based on the length of the list the loop receives.
Thanks!