From jfox at mcmaster.ca  Tue Jan  4 22:55:47 2011
From: jfox at mcmaster.ca (John Fox)
Date: Tue, 4 Jan 2011 16:55:47 -0500
Subject: [Rd] scoping/non-standard evaluation issue
In-Reply-To: <12757_1294177082_p04Lblsd023207_009b01cbac57$532a3b80$f97eb280$@ca>
References: <12757_1294177082_p04Lblsd023207_009b01cbac57$532a3b80$f97eb280$@ca>
Message-ID: <00a401cbac5a$255ac190$701044b0$@ca>

Dear all,

A small correction: I had a stray line in my f2(),

	env <- new.env(parent=.GlobalEnv)

left over from yet another attempt; it can simply be removed.

Sorry for the confusion,
 John

--------------------------------
John Fox
Senator William McMaster 
  Professor of Social Statistics
Department of Sociology
McMaster University
Hamilton, Ontario, Canada
web: socserv.mcmaster.ca/jfox


> -----Original Message-----
> From: r-devel-bounces at r-project.org [mailto:r-devel-bounces at r-project.org]
On
> Behalf Of John Fox
> Sent: January-04-11 4:36 PM
> To: r-devel at r-project.org
> Cc: 'Sanford Weisberg'
> Subject: [Rd] scoping/non-standard evaluation issue
> 
> 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 at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel



[Rd] scoping/non-standard evaluation issue
John Fox