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.