[R] The fastest way to select and execute a few selected func tions inside a function

Liaw, Andy andy_liaw at merck.com
Wed Dec 14 22:13:32 CET 2005


See if the following helps you any:

> flist <- list(min=min, mean=mean, median=median, max=max, n=length)
> x <- rnorm(1000)
> system.time(for (i in 1:1e4) sapply(flist, function(f) f(x)))
[1] 5.90 0.01 6.05   NA   NA
> system.time(for (i in 1:1e4) sapply(flist[c("mean", "median")],
function(f) f(x)))
[1] 5.70 0.00 5.77   NA   NA
> system.time(for (i in 1:1e4) sapply(flist[c("min", "max")], function(f)
f(x)))
[1] 1.75 0.00 1.75   NA   NA

Andy

From: Ales Ziberna
> 
> Dear useRs?
> 
> 
> 
> I have the following problem! I have a function that calls 
> one or more 
> functions, depending on the input parameters. I am searching 
> for the fastest 
> way to select and execute the selected functions and return 
> their results in 
> a list. The number of possible functions is 10, however 
> usually only 2 are 
> selected (although sometimes more, even all).
> 
> 
> 
> For examples, if I have function "myf" and the possible 
> functions that I 
> want to call are "mean", "max" and "sum". I have thought of 
> one way (myf) to 
> do that and am interested if there maybe exists a faster way 
> (the speed is 
> very important, since this can be repeated millions of times in my 
> function).
> 
> 
> 
> 
> 
> myf<-function(FUN, x){
> 
>             f<-list(mean=mean, max=max, sum=sum)
> 
>             res<- vector( mode="list")
> 
>             for(i in FUN){
> 
>                         res[[i]]<-f[[i]](x)
> 
>             }
> 
>             return(res)
> 
> }
> 
> myf(FUN=c("mean","max"),x=1:10)
> 
> 
> 
> 
> 
> In this case, it would be faster if I would compute all 
> functions, even if I 
> need only one:
> 
> myf.all<-function(x){
> 
>             list(mean=mean(x), max=max(x), sum=sum(x))
> 
> }
> 
> 
> 
> > gc();system.time(for(i in 1:10000)myf.all(1:20))
> 
>          used (Mb) gc trigger (Mb) max used (Mb)
> 
> Ncells 165659  4.5     350000  9.4   350000  9.4
> 
> Vcells  61135  0.5     786432  6.0   283043  2.2
> 
> [1] 0.90 0.00 1.08   NA   NA
> 
> > gc();system.time(for(i in 1:10000)myf(FUN="mean",1:20))
> 
>          used (Mb) gc trigger (Mb) max used (Mb)
> 
> Ncells 165659  4.5     350000  9.4   350000  9.4
> 
> Vcells  61135  0.5     786432  6.0   283043  2.2
> 
> [1] 1.14 0.00 1.40   NA   NA
> 
> 
> 
> This does (usually) not happen in my case, since most of functions I 
> consider are more complex.
> 
> 
> 
> Thanks in advance for any suggestions!
> 
> 
> Best regards,
> 
> Ales Ziberna
> 
> ______________________________________________
> 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