[R] Appropriate method for sharing data across functions

John C Nash nashjc at uottawa.ca
Thu Apr 5 22:20:08 CEST 2012


In trying to streamline various optimization functions, I would like to have a scratch pad 
of working data that is shared across a number of functions. These can be called from 
different levels within some wrapper functions for maximum likelihood and other such 
computations. I'm sure there are other applications that could benefit from this.

Below are two approaches. One uses the <<- assignment to a structure I call OPCON. The 
other attempts to create an environment with this name, but fails. Though I have looked at 
a number of references, I have so far not found an adequate description of how to specify 
where the OPCON environment is located. (Both the green and blue books do not cover this 
topic, at least not under "environment" in the index.)

Is there a recommended approach to this? I realize I could use argument lists, but they 
get long and tedious with the number of items I may need to pass, though passing the OPCON 
structure in and out might be the proper way. An onAttach() approach was suggested by Paul 
Gilbert and tried, but it has so far not succeeded and, unfortunately, does not seem to be 
usable from source() i.e., cannot be interpreted but must be built first.

JN

Example using <<-

rm(list=ls())
optstart<-function(npar){ # create structure for optimization computations
    # npar is number of parameters ?? test??
    OPCON<<-list(MAXIMIZE=TRUE, PARSCALE=rep(1,npar), FNSCALE=1,
        KFN=0, KGR=0, KHESS=0)
    # may be other stuff
    ls(OPCON)
}

add1<-function(){
    OPCON$KFN<<-1+OPCON$KFN
    test<-OPCON$KFN
}

OPCON<<-list(MAXIMIZE=TRUE, PARSCALE=rep(1,4), FNSCALE=1,
        KFN=0, KGR=0, KHESS=0)
ls(OPCON)
print(add1())
print(add1())
print(ls.str())

rm(OPCON) # Try to remove the scratchpad
print(ls())

tmp<-readline("Now try from within a function")
setup<-optstart(4) # Need to sort out how to set this up appropriately
cat("setup =")
print(setup)

print(add1())
print(add1())

rm(OPCON) # Try to remove the scratchpad

======================
Example (failing) using new.env:

rm(list=ls())
optstart<-function(npar){ # create structure for optimization computations
    # npar is number of parameters ?? test??
    OPCON<-new.env(parent=globalenv())
    OPCON<-list(MAXIMIZE=TRUE, PARSCALE=rep(1,npar), FNSCALE=1,
        KFN=0, KGR=0, KHESS=0)
    # may be other stuff
    ls(OPCON)
}

add1<-function(){
    OPCON$KFN<-1+OPCON$KFN
    test<-OPCON$KFN
}

OPCON<-new.env(parent=globalenv())
OPCON<-list(MAXIMIZE=TRUE, PARSCALE=rep(1,4), FNSCALE=1,
        KFN=0, KGR=0, KHESS=0)
ls(OPCON)
print(add1())
print(add1())
print(ls.str())

rm(OPCON) # Try to remove the scratchpad
print(ls())

tmp<-readline("Now try from within a function")
setup<-optstart(4) # Need to sort out how to set this up appropriately
cat("setup =")
print(setup)

print(add1())
print(add1())

rm(OPCON) # Try to remove the scratchpad



More information about the R-help mailing list