## 1) A simple progress indicator in percent
for (i in 0:101) {
progress(i)
Sys.sleep(0.01)
if (i == 101) cat("Done!\n")
}
## 2) A progress indicator with 'x on y'
for (i in 0:31) {
progress(i, 30)
Sys.sleep(0.02)
if (i == 31) cat("Done!\n")
}
## 3) A progress bar in percent
for (i in 0:101) {
progress(i, progress.bar = TRUE)
Sys.sleep(0.01)
if (i == 101) cat("Done!\n")
}
## 4) A progress indicator with 'x on y'
for (i in 0:21) {
progress(i, 20, progress.bar = TRUE)
Sys.sleep(0.03)
if (i == 21) cat("Done!\n")
}
## 5) A progression dialog box with Tcl/Tk
## Not run:
# 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.05)
# ## 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)
# }
# ## End(Not run)
Run the code above in your browser using DataLab