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.snow at imail.org
801.408.8111
> -----Original Message-----
> From: r-help-bounces at r-project.org [mailto:r-help-bounces at 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 at 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.