[R] stumped by eval

Ross Boylan ross at biostat.ucsf.edu
Wed Feb 13 18:07:33 CET 2008


On Wed, 2008-02-13 at 11:18 +0100, Peter Dalgaard wrote:
> Berwin A Turlach wrote:
> > G'day Peter,
> >
> > On Wed, 13 Feb 2008 08:03:07 +0100
> > Peter Dalgaard <p.dalgaard at biostat.ku.dk> wrote:
> >
> >   
> >> Ross Boylan wrote:
> >>     
> >>> In the following example, the inner evaluation pulls in the global
> >>> value of subset (a function) rather than the one I thought I was
> >>> passing in (a vector).  Can anyone help me understand what's going
> >>> on, and what I need to do to fix the problem?
> >>>       
> >
> > [...]
> >
> >   
> >> The point is that subset (and offset) arguments are subject to the
> >> same evaluation rules as the terms inside the formula: First look in
> >> "data", then in the environment of the formula, which in this case is
> >> the global environment.

Oh my!  Thank you; in several hours of staring/debugging I didn't get
that, and I'm not sure how many more it would have taken.  Is there any
way I could have discovered that through debugging?  The fact that eval
was a primitive made it hard to see what it was doing, although I guess
the relevant behavior was in model.frame.

I thought at one point that it mattered that subset was not a named
argument of model.frame, although it is an argument for the default
model.frame method.  Does that make any difference?

Also, when I return to my original problem in which the subset argument
(to f0) is missing, will I encounter more difficulties?

Maybe the safest thing to do would be to testing for missing at the top
level and eliminate the corresponding entries in the calll.

Finally, the sample code I gave was a distillation of some code that
started with the code of lm.

Ross
....
> >   
> I told you it was elusive... The thing is that lm() is using nonstandard
> evaluation, so it sees the _symbol_ subset --- er, wait a minute, too
> many "subset"s, let us define it like this instead
> 
> f0 <- function(formula, data, s, na.action)
> {
>   lm(formula, data, subset=s, na.action=na.action)
> }
> 
> Ok, lm() sees the _symbol_ s passed as subset and then looks for it in "data" and then in environment(formula). It never gets the idea to look for "s" in the evaluation frame of f0.
> 
> One workaround is this:
> > f0
> function(formula, data, s, na.action)
> {
>   eval(bquote(lm(formula, data, subset=.(s), na.action=na.action)))
> }
> 
> Another, I think better, way is
> 
> > f0
> function(formula, data, s, na.action)
> {
>   eval(bquote(lm(formula, data, subset=.(substitute(s)), na.action=na.action)))
> }
> 
> 
> The latter also allows
> 
> > f0(Reading~0+Spec+Reader, netto, Spec>0 )
> 
> Call:
> lm(formula = formula, data = data, subset = Spec > 0, na.action = na.action)
> 
> Coefficients:
>    Spec   Reader
> -1.2976   0.7934
> 
> 
> 
> 
> 
> 
> > More over, with the original definition of f0:
> >   
> >> f0
> >>     
> > function(formula, data, subset, na.action)
> > {
> >   f1(formula, data, subset, na.action)
> > }
> >   
> >> (f1(Reading~0+Spec+Reader, netto, subset= Spec==1 ))
> >>     
> >   Reading Spec Reader
> > 1       1    1      1
> >   
> >> f0(Reading~0+Spec+Reader, netto, subset= Spec==1 )
> >>     
> > Error in xj[i] : invalid subscript type 'closure'
> >
> > Given your explanation, I would have expected this to work.
> >   
> I think the issue here is still that model.matrix ends up being called
> with subset=subset rather than subset= Spec==1.
> > Reading up on `subset' in ?model.frame also does not seem to shed light
> > onto what is going on.
> >
> > Remaining confused.....
> >
> > Cheers,
> >
> > 	Berwin
> >
> >   
> 
>



More information about the R-help mailing list