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

Reply via email to