[R] Persistent state in a function?

Bert Gunter bgunter.4567 at gmail.com
Sat Mar 19 17:56:18 CET 2016


Use an environment to hold your table.

?new.env

or

?local

(I leave it to you to work out details)

Cheers,
Bert
Bert Gunter

"The trouble with having an open mind is that people keep coming along
and sticking things into it."
-- Opus (aka Berkeley Breathed in his "Bloom County" comic strip )


On Sat, Mar 19, 2016 at 9:45 AM, 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.



More information about the R-help mailing list