## 1) A simple progress indicator in percent
for (i in 0:101) {
progress(i)
Sys.sleep(0.05)
if (i == 101) cat("Done!
")
}
## 2) A progress indicator with 'x on y'
for (i in 0:31) {
progress(i, 30)
Sys.sleep(0.2)
if (i == 31) cat("Done!
")
}
## 3) A progress bar in percent
for (i in 0:101) {
progress(i, progress.bar = TRUE)
Sys.sleep(0.05)
if (i == 101) cat("Done!
")
}
## 4) A progress indicator with 'x on y'
for (i in 0:21) {
progress(i, 20, progress.bar = TRUE)
Sys.sleep(0.2)
if (i == 21) cat("Done!
")
}
## 5) A progression dialog box with Tcl/Tk
if (require(tcltk)) {
guiProgress <- function(value, max.value) {
## Do we need to destroy the progression dialog box?
if (value > max.value) {
try(tkdestroy(getTemp("guiProgressWindow")), silent = TRUE)
## Clean temporary variables
rmTemp(c("guiProgressState", "guiProgressWindow", "guiProgressCancel"))
## ...and exit
return(invisible(FALSE))
} else if (existsTemp("guiProgressWindow") &&
!inherits(try(tkwm.deiconify(tt <- getTemp("guiProgressWindow")),
silent = TRUE), "try-error")) {
## The progression dialog box exists
## Focus on it and change progress value
tkfocus(tt)
State <- getTemp("guiProgressState")
tclvalue(State) <- value
} else {
## The progression dialog box must be (re)created
## First, make sure there is no remaining "guiProgressStop"
rmTemp("guiProgressCancel")
## Create a Tcl variable to hold current progression state
State <- tclVar(value)
assignTemp("guiProgressState", State)
## Create the progression dialog box
tt <- tktoplevel()
assignTemp("guiProgressWindow", tt)
tktitle(tt) <- "Waiting..."
sc <- tkscale(tt, orient = "h", state = "disabled", to = max.value,
label = "Progress ( tkpack(sc)
but <- tkbutton(tt, text = "Cancel", command = function() {
## Set a flag telling to stop running calculation
assignTemp("guiProgressCancel", TRUE) # Content is not important!
## Destroy the window
tkdestroy(tt)
})
tkpack(but)
}
return(invisible(TRUE))
}
## Register it as function to use in progress()
changeTemp(".progress", "guiProgress", guiProgress, replace.existing = FALSE)
rm(guiProgress) # Don't need this any more
## Test it...
for (i in 0:101) {
progress(i) # Could also set console = FALSE for using the GUI only
Sys.sleep(0.1)
## The code to stop long calc when user presses "Cancel"
if (existsTemp("guiProgressCancel")) {
progress(101, console = FALSE) # Make sure to clean up everything
break
}
if (i == 101) cat("Done!\n")
}
## Unregister the GUI for progress
changeTemp(".progress", "guiProgress", NULL)
}
Run the code above in your browser using DataLab