I think what is going on (and someone is likely to correct me otherwise) is 
that formulas have an associated environment that gets passed along with them 
while character strings do not.

This means that when you pass the object to another function which passes it to 
another function, etc. that eventually one of those nested functions is going 
to do something with the formula, if it is an actual formula then it can look 
in that environment that has been passed along and find the variables that the 
formula refers to and everything is happy.

When you just use the text string, the deeply nested function that is using it 
does not know where to look for the variables referred to in the formula and 
you get your error.

Hope this helps,

-- 
Gregory (Greg) L. Snow Ph.D.
Statistical Data Center
Intermountain Healthcare
greg.s...@imail.org
801.408.8111


> -----Original Message-----
> From: r-help-boun...@r-project.org [mailto:r-help-boun...@r-
> project.org] On Behalf Of Krishna Tateneni
> Sent: Thursday, September 16, 2010 4:56 PM
> To: r-help
> Subject: [R] glm: formula vs character
> 
> Hello,
> 
> This is a question motivated by curiosity, not a pressing problem.  Any
> responses are much appreciated!  In the following code, function reg1
> calls
> glm with a formula object while reg2 uses a string.  In both cases, glm
> works; however, in the second case, the add1 function fails with the
> following message: "Error in eval(predvars, data, env) : invalid
> 'envir'
> argument."  Any insight into what is going on "under the hood"?
> 
> Many thanks,
> --Krishna
> 
> x1 = rnorm(100)
> x2 = rnorm(100)
> x3 = rnorm(100)
> y = x1 + 2*x2 + 3*x3 + 0.05*rnorm(100)
> 
> d = data.frame(y,x1,x2,x3)
> xset = paste("x",1:3,sep="")
> 
> reg1<-function(dep,cand,data){
>   f = paste(dep,"~1",sep="")
>   reg = glm(as.formula(f),family="gaussian",data)
>   add = add1(reg,cand,test="F")
> }
> 
> reg2<-function(dep,cand,data){
>   f = paste(dep,"~1",sep="")
>   reg = glm(f,family="gaussian",data)
>   add = add1(reg,cand,test="F")
> }
> 
> r1 = reg1("y",xset,d)
> r2 = reg2("y",xset,d)
> 
>       [[alternative HTML version deleted]]
> 
> ______________________________________________
> R-help@r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-
> guide.html
> and provide commented, minimal, self-contained, reproducible code.

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to