[R] passing variable to formula environment

Eric Archer Eric.Archer at noaa.gov
Wed Aug 3 21:13:15 CEST 2005


Most excellent Sundar!  Thanks so much!

Cheers,
e.

Sundar Dorai-Raj wrote:

>
>
> Eric Archer wrote:
>
>> List gurus,
>>
>> I'm trying to code a Gompertz growth curve function as part of a 
>> larger project and have run across a problem due to my ignorance of 
>> environments. Some sample data and the function are as follows:
>>
>> growth <- data.frame(age = c(1.92, 3, 5.83, 3.17, 15.5, 1.17, 5.58, 
>> 13.33, 14.29, 5.83, 13.79, 6.33, 13.75, 16.83, 13, 11.67, 0.25, 1.73, 
>> 9.46, 5.67), length = c(157, 165, 179, 171, 195, 135, 179, 193, 194, 
>> 186, 196, 186, 210, 200, 189, 194, 106, 161, 188, 159))
>>
>> # return gompertz fit
>> Gompertz <- function(data,Xintercept,Lzero,start) {
>>   gomp <- formula(length ~ Lzero * exp(k * (1 - exp(-g * (age - 
>> Xintercept)))))
>>   nls(formula=gomp,data=data,start=start)
>> }
>>
>> When I run the function, I get the following error:
>>
>>  > Gompertz(growth,0,87,list(k=0.5,g=0.5))
>> Error in eval(expr, envir, enclos) : Object "Lzero" not found
>>
>> After reading through the help files on 'nls', 'formula', 
>> 'model.frame', and 'environment', I understand that the formula gets 
>> evaluated in the environment in which it is created, and in my case, 
>> "Lzero" is not defined in that environment, but I'm still shaky on 
>> the environment concept and can't figure out how to pass or include 
>> "Lzero" in the environment that nls is evaluating gomp and data in.
>>
>> I have tried redefining "gomp" in the function as:
>>
>> gomp <- as.formula("length ~ Lzero * exp(k * (1 - exp(-g * (age - 
>> Xintercept))))",environment()) # thinking that 'environment()' refers 
>> to environment of Gompertz function where Lzero exists
>>
>> gomp <- as.formula("length ~ Lzero * exp(k * (1 - exp(-g * (age - 
>> Xintercept))))",environment(Gompertz))
>> # trying to explicitly force it
>>
>> gomp <- as.formula("length ~ Lzero * exp(k * (1 - exp(-g * (age - 
>> Xintercept))))",new.env())
>> # my guess at what formula(x,...) does
>>
>> ...but I get the same error. Since I'm still trying to wrap my head 
>> around environments and evaluation in R, the solution to this will be 
>> very educational.  Thanks in advance.
>>
>> Cheers,
>> e.
>>
>
> Hi, Eric,
>
> I think the easiest way to do this is to use substitute:
>
> # return gompertz fit
> Gompertz <- function(data, Xintercept, Lzero, start) {
>   gomp <- substitute(length ~ Lzero * exp(k * (1 - exp(-g * (age - 
> Xintercept)))),
>                      list(Xintercept = Xintercept, Lzero = Lzero))
>   nls(gomp, data, start)
> }
>
> Gompertz(growth, 0, 87, list(k = 0.5, g = 0.5))
>
> HTH,
>
> --sundar



-- 

Eric Archer, Ph.D.
NOAA-SWFSC
8604 La Jolla Shores Dr.
La Jolla, CA 92037
858-546-7121,7003(FAX)
eric.archer at noaa.gov


"Lighthouses are more helpful than churches."
    - Benjamin Franklin

"Cogita tute" - Think for yourself




More information about the R-help mailing list