[R] Persistent state in a function?

Erich Neuwirth erich.neuwirth at univie.ac.at
Sat Mar 19 18:11:27 CET 2016


package memoise
might help you

> On 19 Mar 2016, at 17:45, Boris Steipe <boris.steipe at utoronto.ca> wrote:
> 
> Dear all -
> 
> I need to have a function maintain a persistent lookup table of results for an expensive calculation, a named vector or hash. I know that I can just keep the table in the global environment. One problem with this approach is that the function should be able to delete/recalculate the table and I don't like side-effects in the global environment. This table really should be private. What I don't know is:
> -A- how can I keep the table in an environment that is private to the function but persistent for the session?
> -B- how can I store and reload such table?
> -C- most importantly: is that the right strategy to initialize and maintain state in a function in the first place?
> 
> 
> For illustration ...
> 
> -----------------------------------
> 
> myDist <- function(a, b) {
>    # retrieve or calculate distances
>    if (!exists("Vals")) {
>        Vals <<- numeric() # the lookup table for distance values
>                           # here, created in the global env.
>    }
>    key <- sprintf("X%d.%d", a, b)
>    thisDist <- Vals[key]
>    if (is.na(thisDist)) {          # Hasn't been calculated yet ...
>        cat("Calculating ... ")
>        thisDist <- sqrt(a^2 + b^2) # calculate with some expensive function ...
>        Vals[key] <<- thisDist      # store in global table
>    }
>    return(thisDist)
> }
> 
> 
> # run this
> set.seed(112358)
> 
> for (i in 1:10) {
>    x <- sample(1:3, 2)
>    print(sprintf("d(%d, %d) = %f", x[1], x[2], myDist(x[1], x[2])))
> }
> 
> 
> Thanks!
> Boris
> 
> ______________________________________________
> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 670 bytes
Desc: Message signed with OpenPGP using GPGMail
URL: <https://stat.ethz.ch/pipermail/r-help/attachments/20160319/ed1cbd29/attachment.bin>


More information about the R-help mailing list