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 <[EMAIL PROTECTED]> 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 > > > > > > ______________________________________________ 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.