From therneau at mayo.edu  Mon Apr 18 23:51:50 2011
From: therneau at mayo.edu (Terry Therneau)
Date: Mon, 18 Apr 2011 16:51:50 -0500
Subject: [Rd] help with eval()
Message-ID: <1303163510.29484.82.camel@nemo>

I've narrowed my scope problems with predict.coxph further.
Here is a condensed example:

fcall3 <- as.formula("time ~ age")
dfun3 <- function(dcall) {
    fit <- lm(dcall, data=lung, model=FALSE)
    model.frame(fit)
}
dfun3(fcall3)

The final call fails: it can't find 'dcall'.

The relevant code in model.frame.lm is:
       env <- environment(formula$terms)
       if (is.null(env)) 
            env <- parent.frame()        
	eval(fcall, env, parent.frame())

If the environment of the formula is .Globalenv, as it is here, the
contents of parent.frame() are ignored.  Adding a
           print(ls(parent.frame())) 
statement just above the  final call shows that it isn't a scope issue:
the variables we want are there.

  I don't understand the logic behind looking for variables in the place
the formula was first typed (this is not a complaint).  The inability to
look elsewhere however has stymied my efforts to fix the scoping problem
in predict.coxph, unless I drop the env(formula) argument alltogether.
But I assume there must be good reasons for it's inclusion and am
reluctant to do so.

Terry Therneau

> sessionInfo()
R version 2.13.0 RC (2011-04-12 r55424)
Platform: x86_64-unknown-linux-gnu (64-bit)

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
 [3] LC_TIME=en_US.UTF-8        LC_COLLATE=C              
 [5] LC_MONETARY=C              LC_MESSAGES=en_US.UTF-8   
 [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

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

PS. This also fails
dfun3 <- function(dcall) {
    fit <- lm(dcall, data=lung)
    model.frame(fit, subset=1:10)
}
You just need to force model.frame.lm to recreate data.



[Rd] help with eval()
Terry Therneau