[R] using eval() with pre-built expression inside function

Heather Turner Heather.Turner at warwick.ac.uk
Mon Jan 24 17:38:21 CET 2005


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




More information about the R-help mailing list