[R] expand.model.frame issue

Keith Jewell Keith.Jewell at campdenbri.co.uk
Thu Jun 9 10:57:45 CEST 2016


Following on from a stackoverflow question "Why does this simple 
function calling `lm(..., subset)` fail?"
<http://stackoverflow.com/questions/37326815>
----------
myfun <- function(form., data., subs.) lm(form., data., subs.)
myfun(mpg ~ cyl + hp, mtcars, TRUE)
## Error in eval(expr, envir, enclos) : object 'subs.' not found
---------

The answer to the stated question was in ?lm "If not found in data, the 
variables are taken from environment(formula), typically the environment 
from which lm is called"; the environment of the formula (mpg ~ cyl + 
hp) does not contain 'subs.'. A fix is quite straightforward, set the 
environment of the formula to that of the function, which does contain 
'subs.'. There are multiple ways of doing that, this works but to me 
seems a bit "clunky":
---------------
myfun <- function(form., data., subs.) lm(as.formula(deparse(form.)), 
data., subs.)
myfun(mpg ~ cyl + hp, mtcars, TRUE)
--------------
To me this seems more elegant, but then I have no taste :-}
----------
myfun <- function(form., data., subs.){
   environment(form.) <- environment()
   lm(form., data., subs.)}
myfun(mpg ~ cyl + hp, mtcars, TRUE)
----------

But the OP went on to consider `expand.model.frame` e.g.
-------------
myfun <- function(form., data., subs.){
   environment(form.) <- environment()
   model <- lm(form., data., subs.)
   print(ls(envir = environment(formula(model))))
   expand.model.frame(model, ~drat)}
myfun(mpg ~ cyl + hp, mtcars, TRUE)
## [1] "data." "form." "model" "subs."
## Error in eval(expr, envir, enclos) : object 'subs.' not found
-------------

myfun can be fixed by (e.g.) avoiding the subset argument of lm
------------
myfun <- function(form., data., subs.){
   environment(form.) <- environment()
   model <- lm(form., data.[subs.,])
   expand.model.frame(model, ~drat)}
myfun(mpg ~ cyl + hp, mtcars, TRUE)
------------
... but this message is about the apparent inconsistency between the 
behaviour of expand.model.frame and the help text which says:
?expand.model.frame:
-----------------------
Usage

expand.model.frame(model, extras,
                    envir = environment(formula(model)),
                    na.expand = FALSE)
<snip>
envir	an environment to evaluate things in
---------------------

In the example of the `expand.model.frame` issue above the result of the 
'ls()' clearly shows that 'subs.' is in that environment, but 
expand.model.frame fails to find it.

Am I misunderstanding?
Or is there an error in the help text?
Or is there a bug in expand.model.frame?

=====================
I don't think this is relevant, but for completeness
 > sessionInfo()
R version 3.3.0 (2016-05-03)
Platform: i386-w64-mingw32/i386 (32-bit)
Running under: Windows Server 2008 R2 x64 (build 7601) Service Pack 1

locale:
[1] LC_COLLATE=English_United Kingdom.1252  LC_CTYPE=English_United 
Kingdom.1252
[3] LC_MONETARY=English_United Kingdom.1252 LC_NUMERIC=C 

[5] LC_TIME=English_United Kingdom.1252

attached base packages:
[1] graphics  grDevices datasets  stats     tcltk     utils     tools 
   methods   base

other attached packages:
  [1] CBRIutils_1.0   stringr_1.0.0   svSocket_0.9-57 TinnR_1.0-5 
R2HTML_2.3.1    Hmisc_3.17-4    ggplot2_2.1.0
  [8] Formula_1.2-1   survival_2.39-4 lattice_0.20-33

loaded via a namespace (and not attached):
  [1] Rcpp_0.12.5         magrittr_1.5        cluster_2.0.4 
splines_3.3.0       devtools_1.11.1
  [6] munsell_0.4.3       colorspace_1.2-6    plyr_1.8.3 
nnet_7.3-12         grid_3.3.0
[11] data.table_1.9.6    gtable_0.2.0        latticeExtra_0.6-28 
withr_1.0.1         svMisc_0.9-70
[16] digest_0.6.9        Matrix_1.2-6        gridExtra_2.2.1 
RColorBrewer_1.1-2  acepack_1.3-3.3
[21] rpart_4.1-10        memoise_1.0.0       stringi_1.1.1 
scales_0.4.0        foreign_0.8-66
[26] chron_2.3-47



More information about the R-help mailing list