"Gabor Grothendieck" <[EMAIL PROTECTED]> writes: > Tony, Thomas, Thanks, again. > > If the problem with my last example was just that I was passing a function > rather than an unevaluated expression, then why don't the following > return f with b in place of a? In both cases, a is still there in the > final output. > > f <- function() { a + 1 } > z <- substitute(substitute(f=f,list(a=quote(b))),list(f=parse(text=deparse(f)))) > eval(eval(z)) > > or > > f <- function() { a + 1 } > z <- substitute(substitute(expression(f),list(a=quote(b))),list(f=f)) > eval(eval(eval(z)))
As far as I can see you don't quote *the expression that creates f* in either of the above f <- quote(function() { a + 1 }) attr(f,"source") <- NULL g <- eval(substitute(substitute(f, list(a=quote(b))),list(f=f))) g g() # oops, g is not a function but a call to "function" g <- eval(g) b <- 500 g() If you have only the function to begin with, try something along these lines f <- function() { a + 1 } g <- f attr(g,"source") <- NULL body(g) <- eval(substitute(substitute(f, list(a=quote(b))),list(f=body(f)))) g g() (The real pain in these examples is that substitute autoquotes its expr argument. Therefore, when you want to modify an expression that is already stored in a variable, you need an extra outer layer of eval(substitute(...)) to poke the content of the variable into the inner substitute. An "esub" function with standard evaluation semantics would make this much easier.) -- O__ ---- Peter Dalgaard Blegdamsvej 3 c/ /'_ --- Dept. of Biostatistics 2200 Cph. N (*) \(*) -- University of Copenhagen Denmark Ph: (+45) 35327918 ~~~~~~~~~~ - ([EMAIL PROTECTED]) FAX: (+45) 35327907 ______________________________________________ [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