the following seems an easy solution: f1 <- function(mod){ subs <- 1:10 toeval <- quote(update(mod, subset=subs)) toeval$subset<-subs eval(toeval) }
f1(mod.2) When experimenting with this I once had (by mistake): mod.2 <- lm(update(mod.1, . ~ . - Year + Year)) # instead of just update(this) ... and this helped, too, i.e. f(mod.2) worked. Best regards, Kenn Kenn Konstabel Department of Chronic Diseases National Institute for Health Development Hiiu 42 Tallinn, Estonia On Tue, Jan 4, 2011 at 11:35 PM, John Fox <j...@mcmaster.ca> wrote: > Dear r-devel list members, > > On a couple of occasions I've encountered the issue illustrated by the > following examples: > > --------- snip ----------- > > > mod.1 <- lm(Employed ~ GNP.deflator + GNP + Unemployed + > + Armed.Forces + Population + Year, data=longley) > > > mod.2 <- update(mod.1, . ~ . - Year + Year) > > > all.equal(mod.1, mod.2) > [1] TRUE > > > > f <- function(mod){ > + subs <- 1:10 > + update(mod, subset=subs) > + } > > > f(mod.1) > > Call: > lm(formula = Employed ~ GNP.deflator + GNP + Unemployed + Armed.Forces + > Population + Year, data = longley, subset = subs) > > Coefficients: > (Intercept) GNP.deflator GNP Unemployed Armed.Forces > 3.641e+03 8.394e-03 6.909e-02 -3.971e-03 -8.595e-03 > Population Year > 1.164e+00 -1.911e+00 > > > f(mod.2) > Error in eval(expr, envir, enclos) : object 'subs' not found > > --------- snip ----------- > > I *almost* understand what's going -- that is, clearly mod.1 and mod.2, or > the formulas therein, are associated with different environments, but I > don't quite see why. > > Anyway, here are two "solutions" that work, but neither is in my view > desirable: > > --------- snip ----------- > > > f1 <- function(mod){ > + assign(".subs", 1:10, envir=.GlobalEnv) > + on.exit(remove(".subs", envir=.GlobalEnv)) > + update(mod, subset=.subs) > + } > > > f1(mod.1) > > Call: > lm(formula = Employed ~ GNP.deflator + GNP + Unemployed + Armed.Forces + > Population + Year, data = longley, subset = .subs) > > Coefficients: > (Intercept) GNP.deflator GNP Unemployed Armed.Forces > 3.641e+03 8.394e-03 6.909e-02 -3.971e-03 -8.595e-03 > Population Year > 1.164e+00 -1.911e+00 > > > f1(mod.2) > > Call: > lm(formula = Employed ~ GNP.deflator + GNP + Unemployed + Armed.Forces + > Population + Year, data = longley, subset = .subs) > > Coefficients: > (Intercept) GNP.deflator GNP Unemployed Armed.Forces > 3.641e+03 8.394e-03 6.909e-02 -3.971e-03 -8.595e-03 > Population Year > 1.164e+00 -1.911e+00 > > > f2 <- function(mod){ > + env <- new.env(parent=.GlobalEnv) > + attach(NULL) > + on.exit(detach()) > + assign(".subs", 1:10, pos=2) > + update(mod, subset=.subs) > + } > > > f2(mod.1) > > Call: > lm(formula = Employed ~ GNP.deflator + GNP + Unemployed + Armed.Forces + > Population + Year, data = longley, subset = .subs) > > Coefficients: > (Intercept) GNP.deflator GNP Unemployed Armed.Forces > 3.641e+03 8.394e-03 6.909e-02 -3.971e-03 -8.595e-03 > Population Year > 1.164e+00 -1.911e+00 > > > f2(mod.2) > > Call: > lm(formula = Employed ~ GNP.deflator + GNP + Unemployed + Armed.Forces + > Population + Year, data = longley, subset = .subs) > > Coefficients: > (Intercept) GNP.deflator GNP Unemployed Armed.Forces > 3.641e+03 8.394e-03 6.909e-02 -3.971e-03 -8.595e-03 > Population Year > 1.164e+00 -1.911e+00 > > --------- snip ----------- > > The problem with f1() is that it will clobber a variable named .subs in the > global environment; the problem with f2() is that .subs can be masked by a > variable in the global environment. > > Is there a better approach? > > Thanks, > John > > -------------------------------- > John Fox > Senator William McMaster > Professor of Social Statistics > Department of Sociology > McMaster University > Hamilton, Ontario, Canada > web: socserv.mcmaster.ca/jfox > > ______________________________________________ > R-devel@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel > [[alternative HTML version deleted]] ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel