R: Evaluates an R expression with memoization

evalWithMemoization {R.cache} | R Documentation

## Evaluates an R expression with memoization

### Description

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.

### Usage

    evalWithMemoization(expr, key=NULL, ..., envir=parent.frame(), force=FALSE)

### Arguments

`expr` | The `expression` to be evaluated.
`key` | Additional objects to uniquely identify the evaluation.
`...` | Additional arguments passed to `loadCache`() and `saveCache`().
`envir` | The `environment` in which the expression should be evaluated.
`force` | If `TRUE`, existing cached results are ignored.

### Value

Returns the value of the evaluated `expr` `expression`, if any.

### Author(s)

Henrik Bengtsson

### See Also

Internally, `eval`() is used to evaluate the expression.

### Examples

    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 ...)

    ## 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 ...)

    ## 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

[Package R.cache version 0.13.0 Index]