"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

Reply via email to