On Mon, Apr 18, 2011 at 5:51 PM, Terry Therneau <thern...@mayo.edu> wrote: > 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. >
Try using do.call. Using the built in BOD to illustrate, we first try the posted code to view the error: > fcall3 <- as.formula("demand ~ Time") > dfun3 <- function(dcall) { + fit <- lm(dcall, data=BOD, model=FALSE) + model.frame(fit) + } > dfun3(fcall3) Error in model.frame(formula = dcall, data = BOD, drop.unused.levels = TRUE) : object 'dcall' not found > > # now replace the lm call with a do.call("lm" ...) > # so that dcall gets substituted before the call to lm: > > fcall3 <- as.formula("demand ~ Time") > dfun3 <- function(dcall) { + fit <- do.call("lm", list(dcall, data = BOD, model = FALSE)) + model.frame(fit) + } > dfun3(fcall3) demand Time 1 8.3 1 2 10.3 2 3 19.0 3 4 16.0 4 5 15.6 5 6 19.8 7 -- Statistics & Software Consulting GKX Group, GKX Associates Inc. tel: 1-877-GKX-GROUP email: ggrothendieck at gmail.com ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel