Duncan Murdoch wrote:

Code like

df <- data.frame(x=1:10)
y <- 20:29

eval(quote(x+y), env=df)

does what you might expect:  it looks for x and y in the data.frame,
and when it doesn't find y there, it looks in the parent environment.

However, sometimes I'd like to construct a single environment out of
df, so that I can pass it to nested functions and get the same
behaviour.  Right now, I get the wrong answer from code like this:

f1 <- function(df) {
    g <- function() {
        eval(quote(x+y), env=df)
    }
    y <- 1:10
    g()
}

f1(df)

because the eval looks in the environment of f1, finds y there, and
gives me the wrong answer.

I can modify f1 so it works:

f2 <- function(df) {
    g <- function(env) {
        eval(quote(x+y), env=df, enclos=env)
    }
    y <- 1:10
    g(parent.frame())
}

but this means carrying around both parent.frame() and df.  I'd like
to do this:

f3 <- function(df) {
    env <- as.environment(df)

    g <- function() {
        eval(quote(x+y), env=env)
    }

    y <- 1:10
    g()
}

and get the same result as from f2(df), but currently as.environment
doesn't like to be passed a data.frame.  Is there a better way to do
the same thing?

Duncan Murdoch


I don't think it's easily possibe (but Luke et al. might want to correct me). My dirty solution would be:

f4 <- function(df) {
    env <- new.env()
    mapply(function(x, y) assign(y, x, envir=env), df, names(df))
    g <- function()
        eval(quote(x+y), env=env)
    y <- 1:10
    g()
}
f4(df)



Uwe

______________________________________________
[EMAIL PROTECTED] mailing list
https://www.stat.math.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html

Reply via email to