Hi Eric,

Thank you for your answer!

On Mon, 27 Aug 2018 21:48:50 +0300
Eric Berger <ericjber...@gmail.com> wrote:

> you might want to consider the more recent R6 package

Indeed, R6 has private fields which fits my idea of an object with
mutable state even better.

My original problem seems to be solved and I'm posting my code (CC0) in
case someone else needs it as a reference:

require(digest); require(R6)
memoised <- R6Class(
        "memoised", lock_objects=T, lock_class=T, cloneable=F,
        private=list(fun=NULL, storage=NULL, cache=NULL),
        public=list(
                initialize=function(fun, storage) { # constructor
                        private$fun <- fun
                        private$storage <- storage
                        private$cache <- tryCatch(
                                {
                                        load(storage)
                                        cache
                                }, error = function(e) {
                                        new.env(T, emptyenv())
                                }
                        )
                },
                eval=function(...) { # behave as cached fun
                        hash <- digest(list(...), algo="sha1")
                        if (exists(hash, private$cache)) return(get(hash, 
private$cache))
                        val <- private$fun(...)
                        assign(hash, val, private$cache)
                        val
                },
                par.eval=function(args, cl) { # args is list of argument lists
                        # hash all because we'll need them later
                        hashes <- lapply(args, digest, algo="sha1")
                        # indices of not yet evaluated in the original args 
array
                        missing <- Filter(function(i) !exists(hashes[[i]], 
private$cache), seq_along(args))
                        # evaluate and save them
                        values <- parLapply(cl, args[missing], function(l) 
do.call(private$fun,l))
                        private$cache[hashes[missing]] <- values
                        # get all requested hashes
                        private$cache[hashes]
                },
                finalize=function() { # destructor
                        cache <- private$cache # must have known name for 
restore
                        save(cache, file=private$storage)
                }
        )
)

It's still a mystery why did setRefClass refuse to lock my class, but
at least it's not blocking my progress.

-- 
Best regards,
Ivan

______________________________________________
R-help@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.

Reply via email to