[Rd] challenge: using 'subset = <computed>' inside function ..

Martin Maechler maechler at stat.math.ethz.ch
Fri Nov 18 21:32:58 CET 2005

I've been asked by someone else whom I originally taught 
`` to just work with substitute() and then all will be fine'' ...

But it looks to me that I've been caught here.

Is it possible to make this work along the way we thought it should?

1)  Inside a function, say tst() with the 'formula' and a 'data' argument, 
2)  call another modeling function using 'subset = <EXPR>' with the *original*
3)  but <EXPR> is really computed from 'formula' itself ..

It would probably be pretty easy to use a modified 'data' (data
frame), inside tst(), instead of trying to the original data;
but let's assume for the moment that this is not at all wanted.

Here is example code {that fails}
showing several other possibilities that fail as well

tst <- function(formula, data, na.action = na.omit) {

    stopifnot(inherits(formula,"formula"), length(formula) == 3)
    ## I want to fit a model to those observations that have 'Y > 0'
    ## where 'Y' is the left-hand-side (LHS)
    ## The really natural problem is using 'subset'; since I want to keep 'data' intact
    ## It's really  lm(), glm(), gam(), ... but the problem is with model.frame:

    cat("subsetting expression: ")
    print(substitute(Y > 0, list(Y = formula[[2]])))# is perfect
    YY <- formula[[2]]
    cat("  or   "); print(bquote(.(YY) > 0))

    mf <- model.frame(formula, data=data,
                      subset = bquote(.(YY) > 0),
                      ##or subset = substitute(Y > 0, list(Y = formula[[2]])),
                      ##or subset = eval(substitute(Y > 0, list(Y = formula[[2]]))),
                      ##or subset = as.expression(bquote(.(formula[[2]]) > 0)),
                      ##or subset = bquote(.(formula[[2]]) > 0),
                      na.action = na.action)

## never works
tst(ncases ~ agegp + alcgp, data = esoph)

traceback() #--> shows that inside model.frame.default
	    #    eval(substitute(subset, ...))  is called as well


Happy quizzing..

Martin Maechler, ETH Zurich

More information about the R-devel mailing list