evalWithMemoization.RdEvaluates 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