I agree with almost everything Deepayan said, but would add one thing:


On 21/10/2021 3:41 a.m., Deepayan Sarkar wrote:
 ...

My suggestion is having a package-specific environment, and Duncan's
is to have a function-specific environment. If you only need this for
this one function, then that should be good enough. If you eventually
want to access the persistent information from multiple functions,
having a package-specific environment would be more useful.

I agree with that statement, but those aren't the only two choices. Your local() call can create several functions and return them in a list; then just those functions have access to the local variables. For example,

createFns <- local({

   .fooInfo <- NULL

   fn1 <- function (...) { ... }
   fn2 <- function (...) { ... }

   list(fn1 = fn1, fn2 = fn2)
})

fns <- createFns()
fn1 <- fns$fn1
fn2 <- fns$fn2

Now fn1 and fn2 are functions that can see .fooInfo, and nobody else can (without going through contortions).

One other difference between this approach and the package-specific environment: there's only one package-specific environment in Deepayan's formulation, but I could call createFns() several times, creating several pairs of functions, each pair with its own independent version of .fooInfo.

I don't know if that's something that would be useful to you, but conceivably you'd want to maintain partial plots in several different windows, and that would allow you to do so.

And there are other choices too: there are several packages implementing object systems that allow objects to maintain persistent data. I haven't used those, so this list may contain omissions and errors: R6, R.oo, proto.

Duncan Murdoch

______________________________________________
R-package-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-package-devel

Reply via email to