runifChanged: runifChanged

View source: R/hashCheck.r

runifChangedR Documentation



Re-run Code if an Input Changed


runifChanged(fun, ..., file = NULL, .print. = TRUE, .inclfun. = TRUE)



the (usually slow) function to run


input objects the result of running the function is dependent on


file in which to store the result of fun augmented by attributes containing hash digests


set to TRUE to list which objects changed that neessitated re-running f


set to FALSE to not include fun in the hash digest, i.e., to not require re-running fun if only fun itself has changed


Uses hashCheck to run a function and save the results if specified inputs have changed, otherwise to retrieve results from a file. This makes it easy to see if any objects changed that require re-running a long simulation, and reports on any changes. The file name is taken as the chunk name appended with .rds unless it is given as ⁠file=⁠. fun has no arguments. Set .inclfun.=FALSE to not include fun in the hash check (for legacy uses). The typical workflow is as follows.

f <- function(       ) {
# . . . do the real work with multiple function calls ...
seed <- 3
w <- runifChanged(f, seed, obj1, obj2, ....)

⁠seed, obj1, obj2⁠, ... are all the objects that f() uses that if changed would give a different result of f(). This can include functions such as those in a package, and f will be re-run if any of the function's code changes. f is also re-run if the code inside f changes. The result of f is stored with saveRDS by default in file named xxx.rds where xxx is the label for the current chunk. To control this use instead file=xxx.rds add the file argument to runifChanged(...). If nothing has changed and the file already exists, the file is read to create the result object (e.g., w above). If f() needs to be run, the hashed input objects are stored as attributes for the result then the enhanced result is written to the file.

See here for examples.


the result of running fun


Frank Harrell

harrelfe/Hmisc documentation built on May 19, 2024, 4:13 a.m.