[R] eval(parse(text vs. get when accessing a function

Gabor Grothendieck ggrothendieck at gmail.com
Sat Jan 6 15:03:56 CET 2007


Here are a few more timing alternatives from slowest to
fastest.  Of the ones that dynamically construct the name
of the frunction (all except last example), get seems to be
the fastest although its still 6x slower than the if statement.

> f.1 <- function(x) x+1
> f.2 <- function(x) x+2
>
> n <- 10^4; i <- 1; x <- 10
>
> system.time(
+     replicate(n, eval(parse(text=paste('f.', i, sep='')))(x))
+ )
[1] 1.27 0.00 1.31   NA   NA
>
> system.time(
+     replicate(n, match.fun(paste("f.", i, sep=''))(x) )
+ )
[1] 1.15 0.01 1.20   NA   NA
>
> system.time(
+     replicate(n, do.call(paste("f.", i, sep=''), list(x)) )
+ )
[1] 0.99 0.00 1.02   NA   NA
>
> system.time(
+     replicate(n, get(paste("f.", i, sep=''))(x) )
+ )
[1] 0.93 0.00 0.94   NA   NA
>
> system.time(
+     replicate(n, {if(i %% 2 == 0) f.1 else f.2}(x) )
+ )
[1] 0.15 0.00 0.15   NA   NA



On 1/5/07, jim holtman <jholtman at gmail.com> wrote:
> The other reason for considering which of the different approaches to use
> would be performance:
>
> > f.1 <- function(x) x+1
> > f.2 <- function(x) x+2
> >
> > system.time({
> +     for (i in 1:100000){
> +         eval(parse(text=paste('f.', i%%2+1, sep='')))(i)
> +     }
> + })
> [1] 6.96 0.00 8.32   NA   NA
> >
> > system.time({
> +     for (i in 1:100000){
> +         {if(i %% 2 == 0) f.1 else f.2}(i)
> +     }
> + })
> [1] 0.52 0.00 0.61   NA   NA
> >
> >
>
> eval(parse...) seems to be an order of magnitude slower.  It would make a
> difference if you were calling it several thousand times; so it depends on
> your application.
>
>
> On 1/5/07, Ramon Diaz-Uriarte <rdiaz at cnio.es> wrote:
> >
> > On Friday 05 January 2007 19:35, Bert Gunter wrote:
> > > ??
> > >
> > > Or to add to what Peter Dalgaard said... (perhaps for the case of many
> > more
> > > functions)
> > >
> > > Why eval(parse())? What's wrong with if then?
> > >
> > > g <- function(fpost,x){if(fpost==1)f.1 else f.2 }(x)
> > >
> > > or switch() if you have more than 2 possible arguments? I think your
> > > remarks reinforce the wisdom of Thomas's "axiom" .
> >
> > Thanks, Bert, but as with Peter's solution, your solution forces me to
> > build g
> > ahead of time. And again, I am not sure I see why the attempt to avoid
> > eval(parse(text.
> >
> > Best,
> >
> > R.
> >
> >
> > >
> > > Bert Gunter
> > > Genentech Nonclinical Statistics
> > > South San Francisco, CA 94404
> > >
> > >
> > > -----Original Message-----
> > > From: r-help-bounces at stat.math.ethz.ch
> > > [mailto:r-help-bounces at stat.math.ethz.ch] On Behalf Of Ramon
> > Diaz-Uriarte
> > > Sent: Friday, January 05, 2007 10:02 AM
> > > To: r-help; rdiaz02 at gmail.com
> > > Subject: [R] eval(parse(text vs. get when accessing a function
> > >
> > > Dear All,
> > >
> > > I've read Thomas Lumley's fortune "If the answer is parse() you should
> > > usually
> > > rethink the question.". But I am not sure it that also applies (and why)
> > to
> > > other situations (Lumley's comment
> > > http://tolstoy.newcastle.edu.au/R/help/05/02/12204.html
> > > was in reply to accessing a list).
> > >
> > > Suppose I have similarly called functions, except for a postfix. E.g.
> > >
> > > f.1 <- function(x) {x + 1}
> > > f.2 <- function(x) {x + 2}
> > >
> > > And sometimes I want to call f.1 and some other times f.2 inside another
> > > function. I can either do:
> > >
> > > g <- function(x, fpost) {
> > >     calledf <- eval(parse(text = paste("f.", fpost, sep = "")))
> > >     calledf(x)
> > >     ## do more stuff
> > > }
> > >
> > >
> > > Or:
> > >
> > > h <- function(x, fpost) {
> > >     calledf <- get(paste("f.", fpost, sep = ""))
> > >     calledf(x)
> > >     ## do more stuff
> > > }
> > >
> > >
> > > Two questions:
> > > 1) Why is the second better?
> > >
> > > 2) By changing g or h I could use "do.call" instead; why would that be
> > > better?
> > > Because I can handle differences in argument lists?
> > >
> > >
> > >
> > > Thanks,
> > >
> > >
> > > R.
> >
> > --
> > Ramón Díaz-Uriarte
> > Centro Nacional de Investigaciones Oncológicas (CNIO)
> > (Spanish National Cancer Center)
> > Melchor Fernández Almagro, 3
> > 28029 Madrid (Spain)
> > Fax: +-34-91-224-6972
> > Phone: +-34-91-224-6900
> >
> > http://ligarto.org/rdiaz
> > PGP KeyID: 0xE89B3462
> > (http://ligarto.org/rdiaz/0xE89B3462.asc)
> >
> >
> >
> > **NOTA DE CONFIDENCIALIDAD** Este correo electrónico, y en s...{{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
> > and provide commented, minimal, self-contained, reproducible code.
> >
>
>
>
> --
> Jim Holtman
> Cincinnati, OH
> +1 513 646 9390
>
> What is the problem you are trying to solve?
>
>        [[alternative HTML version deleted]]
>
>
>
> ______________________________________________
> 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
> and provide commented, minimal, self-contained, reproducible code.
>
>
>



More information about the R-help mailing list