merging environments
On 3/7/2008 2:02 PM, Ben Bolker wrote:
Despite the spirited arguments of various R-core folks who feel that mle() doesn't need a "data" argument, and that users would be better off learning to deal with function closures, I am *still* trying to make such things work in a reasonably smooth fashion ... Is there a standard idiom for "merging" environments?
One way is to set one as the parent of the other. If they both already have non-empty parents, you're out of luck.
i.e., suppose a function has an environment that I want
to preserve, but _add_ the contents of a data list --
would something like this do it? Is there a less ugly
way?
x <- 0
y <- 1
z <- 2
f <- function() {
x+y+z
}
f2 <- function(fun,data) {
L <- ls(pos=environment(fun))
mapply(assign,names(data),data,
MoreArgs=list(envir=environment(fun)))
print(ls(pos=environment(fun)))
}
f2(f,list(a=1))
Luckily lists and data.frames don't have parents, so you can make a new
environment, put the elements of data into it, and set the old
environment as its parent. That's sort of like what you did, but
slightly different, and with fewer bad side effects:
bothenvs <- function(fun,data) {
newenv <- new.env(hash=TRUE, parent=environment(fun))
mapply(assign,names(data),data,
MoreArgs=list(envir=newenv))
newenv
}
It would sure be nice if as.environment() took a list as an arg and
turned it into an environment, but no such luck.
Duncan Murdoch
------------------------------------------------------------------------
______________________________________________ R-devel at r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel