[R] eval and evironments: call local function in a global function

Renaud Gaujoux getoxxx at gmail.com
Thu Aug 20 10:27:18 CEST 2009


Hi,

in my project I want the user to be able to write hook functions that 
are in turn called in my main code. I'd like the user's hooks to be able 
to call some function that set a variable outside their running 
environment. The trick is that this variable is not global, but defined 
on runtime before calling the hooks, and I don't want to leave any trace 
(i.e. global variables) after the main code has finished.

I thought that the following would work but it doesn't. I guess I got 
too messy with environment and enclosures:

# global function defined by the user
fun.global <- function(){
    message('fun.global')
    setVar(5) #
}


# my main code
main <- function(){
    message('main')
 
    # define a function to set some local variable
    setVar <- local({
    l.var <- 0
    function(value){
        message('setVar')
       l.var <<- value
    }
    })
    .workspace <- environment(setVar)
    environment(setVar) <- new.env()
 
    eval(fun.global(), enclos=environment(setVar))
    print(get('l.var', envir=.workspace, inherits=FALSE))
}

main()

I get the following output:
 > main
 > fun.global
 > Error in fun.global() : could not find function "setVar"

There is definitely a problem of lookup somewhere. I first tried without 
eval, as I thought that function setVar would then be defined in a 
parent environment of the call to fun.global, but it does not work either.
Can anybody tell me what's the problem and how I should do my stuff?

Thanks,
Renaud




More information about the R-help mailing list