Sorry, I forgot to add to my original post that I want to use the "envir" argument of eval() so that I can specify a secondary data source as follows:
eval(expression(model.frame(formula, data = lookHereFirst), envir = lookHereSecond, enclos = lookHereThird) Your version of f1 does produce the desired model frame, but does this by passing all the data to model.frame() directly, i.e. it evaluates model.frame(formula = y~x, data = dataset) However, if I adapt your f1 as follows: f1 <- function(formula, data) { mf <- match.call(expand.dots = FALSE) mf[[1]] <- as.name("model.frame") print(mf) mf } it still works if some of the data is provided through the "data" argument of model.frame() and the rest of the data is provided through the "envir" argument of eval(): > test1 <- f1(formula = y ~ x, data = dataset[,1, drop = FALSE]) model.frame(formula = y ~ x, data = dataset[, 1, drop = FALSE]) > eval(test1, dataset[,2,drop = FALSE], parent.frame()) y x 1 66.71259 1 2 83.21937 1 3 85.24412 1 4 88.10189 1 5 75.71918 1 .... So you have provided a solution, but I still don't understand why I can't construct the call as I was trying to before: f2 <- function(formula, data) { mf <- as.call(c(as.name("model.frame"), formula = formula, data = substitute(data))) print(mf) mf } This doesn't work: > test2 <- f2(formula = y ~ x, data = dataset[,1, drop = FALSE]) model.frame(formula = y ~ x, data = dataset[, 1, drop = FALSE]) > eval(test2, dataset[,2,drop = FALSE], parent.frame()) Error in eval(expr, envir, enclos) : Object "x" not found Apparently test1 and test2 are not identical, but I can't see why, which may be the root of my problem here. Can anyone explain why they are different? Thanks Heather >>> "Roger D. Peng" <[EMAIL PROTECTED]> 01/24/05 04:48pm >>> If you look at the beginning of lm(), you'll see that match.call() is used and name of the function (in this case "f1") is replaced with "model.frame". Does something like this work? f1 <- function(formula, data) { mf <- match.call(expand.dots = FALSE) mf[[1]] <- as.name("model.frame") eval(mf, parent.frame()) } -roger Heather Turner wrote: > I'm trying to evaluate a pre-built expression using eval(), e.g. > > dataset <- data.frame(y = runif(30, 50,100), x = gl(5, 6)) > > # one like this > mf <- expression(model.frame(y~x)) > eval(mf, dataset, parent.frame()) > > # rather than this > eval(expression(model.frame(y~x)), dataset, parent.frame()) > > In the example above there is no problem, the problem comes when I try to do > a similar thing within a function, e.g. > > f1 <- function(formula, data) { > mt <- terms(formula) > mf <- as.expression(as.call(c(as.name("model.frame"), formula = mt))) > eval(mf, data, parent.frame()) > } > > >>f1(formula = y ~ x, data = dataset) > > Error in eval(expr, envir, enclos) : Object "y" not found > > I can get round this by building a call to eval using paste, e.g. > > f2 <- function(formula, data) { > mt <- terms(formula) > mf <- as.expression(as.call(c(as.name("model.frame"), formula = mt))) > direct <- parse(text = paste("eval(expression(", mf, > "), data, parent.frame())")) > print(direct) > eval(direct) > } > > >>f2(formula = y ~ x, data = dataset) > > expression(eval(expression(model.frame(formula = y ~ x)), data, > parent.frame())) > y x > 1 92.23087 1 > 2 63.43658 1 > 3 55.24448 1 > 4 72.75650 1 > 5 67.58781 1 > ... > > but this seems rather convoluted. Can anyone explain why f1 doesn't work > (when f2 does) and/or suggest a neater way of dealing with this? > > Thanks > > Heather > > Mrs H Turner > Research Assistant > Dept. of Statistics > University of Warwick > > ______________________________________________ > R-help@stat.math.ethz.ch mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html > -- Roger D. Peng http://www.biostat.jhsph.edu/~rpeng/ ______________________________________________ R-help@stat.math.ethz.ch mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html