Giles Hooker wrote:
How can I define environments within a function so that they are visible
to calls to a sub-function?

I think you need to give a simplified, runnable example. (Or at least runnable until it hits the scoping problem you've got.) "Sub-function" isn't R terminology, and it's not clear what you mean by it.

In R, you rarely need to work with environments explicitly. You just define functions in the same location and they share the same environment. For example,

fnBuilder <- function(commonArgs) {
 commonVars <- ...
 ProfileErr <- function(params, ...) {}
 coefs <- function(params, ...) {}
 return(list(ProfileErr, coefs))
}

both <- fnBuilder(...)
ProfileErr <- both[[1]]
coefs <- both[[2]]

Now ProfileErr and coefs share the same environment, and both can see (and modify) commonArgs and commonVars.

Duncan Murdoch


I have defined an objective function,

        ProfileErr = function(params,...)

which I would like to optimize using standard routines (optim,
nlminb,....) but which contains auxiliary variables which need to be
updated along with params. No optimization routine in R that I have
found has facilities for this.

Specifically, within ProfileErr, I need to calculate

        coefs(params,...)

This a function which requires a further optimization, and I can achieve
significant efficiency gains by starting  where the last optimization
ended, so I would like to keep track of it.

At the command line, I get around this by

        ProfileEnv = new.env()
        assign('coefs',coefs,3,ProfileEnv)

and within ProfileErr, I can call

        startcoefs = get('coefs',envir=ProfileEnv)
        * do the optimization to get newcoefs *
        assign('coefs',newcoefs,3,ProfileEnv)

Then calling

        optim(pars,ProfileErr,....)

works fine. However, when I try to wrap all of that in its own function

        profile.estimate = fn(pars,...){
                ProfileEnv = new.env()
                assign('coefs',coefs,3,ProfileEnv)
        
                res = optim(pars,ProfileErr,....)
        }


ProfileErr no longer sees ProfileEnv. I haven't been able to make much
sense out of the documentation on environments, but is there a way to
make this work? Otherwise I'm back to writing variables out to files.

Many thanks,

Giles




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

Reply via email to