evalWithMemoization.Rd
Evaluates an R expression with memoization such that the same objects are assigned to the current environment and the same result is returned, if any.
evalWithMemoization(expr, key=NULL, ..., envir=parent.frame(),
drop=c("srcref", "srcfile", "wholeSrcref"), force=FALSE)
The expression
to be evaluated.
Additional objects to uniquely identify the evaluation.
The environment
in which the expression should
be evaluated.
character
vector of expr
attributes to drop.
The default is to drop all source-reference information.
If TRUE
, existing cached results are ignored.
Returns the value of the evaluated expr
expression
, if any.
Internally, eval
() is used to evaluate the expression.
for (kk in 1:5) {
cat(sprintf("Iteration #%d:\n", kk))
res <- evalWithMemoization({
cat("Evaluating expression...")
a <- 1
b <- 2
c <- 4
Sys.sleep(1)
cat("done\n")
b
})
print(res)
# Sanity checks
stopifnot(a == 1 && b == 2 && c == 4)
# Clean up
rm(a, b, c)
} # for (kk ...)
#> Iteration #1:
#> Evaluating expression...done
#> [1] 2
#> Iteration #2:
#> [1] 2
#> Iteration #3:
#> [1] 2
#> Iteration #4:
#> [1] 2
#> Iteration #5:
#> [1] 2
## OUTPUTS:
## Iteration #1:
## Evaluating expression...done
## [1] 2
## Iteration #2:
## [1] 2
## Iteration #3:
## [1] 2
## Iteration #4:
## [1] 2
## Iteration #5:
## [1] 2
############################################################
# WARNING
############################################################
# If the expression being evaluated depends on
# "input" objects, then these must be be specified
# explicitly as "key" objects.
for (ii in 1:2) {
for (kk in 1:3) {
cat(sprintf("Iteration #%d:\n", kk))
res <- evalWithMemoization({
cat("Evaluating expression...")
a <- kk
Sys.sleep(1)
cat("done\n")
a
}, key=list(kk=kk))
print(res)
# Sanity checks
stopifnot(a == kk)
# Clean up
rm(a)
} # for (kk ...)
} # for (ii ...)
#> Iteration #1:
#> Evaluating expression...done
#> [1] 1
#> Iteration #2:
#> Evaluating expression...done
#> [1] 2
#> Iteration #3:
#> Evaluating expression...done
#> [1] 3
#> Iteration #1:
#> [1] 1
#> Iteration #2:
#> [1] 2
#> Iteration #3:
#> [1] 3
## OUTPUTS:
## Iteration #1:
## Evaluating expression...done
## [1] 1
## Iteration #2:
## Evaluating expression...done
## [1] 2
## Iteration #3:
## Evaluating expression...done
## [1] 3
## Iteration #1:
## [1] 1
## Iteration #2:
## [1] 2
## Iteration #3:
## [1] 3