[R] defining a template for functions via do.call and substitute.

Berton Gunter gunter.berton at gene.com
Wed Sep 29 18:55:24 CEST 2004


John:

Andy and Dimitris have already fully answered your query. However, as you
seem to mainly be interested in simple string substitution, I wanted to
point out that there is a perhaps more transparent approach using gsub()
that does just this. 

Here's a slightly more complicated function form to illustrate the idea:

> f<-function(a,b){z<-a+b; b+z*sin(b)}
 
> ## Get the body of the function and convert it to a character vector:
>  bf<-deparse(body(f))
 
> orig<-c('a','b')  ## original symbols
> changed<-c('x','y') ## the character strings you wish to substitute for
them
 
> ## perform the string substitution
>  for(i in seq(along=changed))bf<-gsub(orig[i],changed[i],bf)
 
> ## re-parse the body and change the formals
>  body(f)<-parse(text=bf)
>  names(formals(f))<-changed
 
> f
function (x, y) 
{
    z <- x + y
    y + z * sin(y)
}

substitute's real power lies in its ability to substitute whole expressions
bound to a symbol in an environment, and this might be overkill here.

Cheers,

-- Bert Gunter
Genentech Non-Clinical Statistics
South San Francisco, CA
 
"The business of the statistician is to catalyze the scientific learning
process."  - George E. P. Box
 
 

> -----Original Message-----
> From: r-help-bounces at stat.math.ethz.ch 
> [mailto:r-help-bounces at stat.math.ethz.ch] On Behalf Of 
> john.gavin at ubs.com
> Sent: Wednesday, September 29, 2004 4:17 AM
> To: r-help at stat.math.ethz.ch
> Subject: [R] defining a template for functions via do.call 
> and substitute.
> 
> Hi,
> 
> Given a function
> 
>   fun <- function(a, b) a + b
> 
> how do I generate the function 'function(x, y) x + y'?
> 
> Working from the help files and Bill Venables' R-news article 
> (June 2002),
> I have tried various permutations with substitute without success. 
> e.g.
>   do.call("substitute", list(fun, list(a = as.name("x"), b = 
> as.name("y"))))
> 
> Regards,
> 
> John.
> 
> John Gavin <john.gavin at ubs.com>,
> Quantitative Risk Models and Statistics,
> UBS Investment Bank, 6th floor, 
> 100 Liverpool St., London EC2M 2RH, UK.
> Phone +44 (0) 207 567 4289
> Fax   +44 (0) 207 568 5352
> 
> Visit our website at http://www.ubs.com
> 
> This message contains confidential information and is 
> intend...{{dropped}}
> 
> ______________________________________________
> R-help at 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
>




More information about the R-help mailing list