# [R] SLLOOOWWW function ...

Michael Dewey info at aghmed.fsnet.co.uk
Wed Jul 18 17:43:14 CEST 2007

```At 12:32 17/07/2007, Johannes Graumann wrote:
>Does anybody have any insight into how to make this faster?

I am not an expert on R programming by any means but I notice you are
growing your new data frame row by row. I believe it is normally

>I suspect, that the rounding going on may be an issue, as is the stepping
>through data frame rows using integers ...
>
>If you have the patience to teach a noob, he will highly appreciate it ;0)
>
>Joh
>
>digit <- 4
>for (minute in seq(from=25,to=lrange[2])){
>   # Extract all data associtaed with the current time (minute)
>   frame <- subset(mylist,mylist[["Time"]] == minute)
>   # Sort by Intensity
>   frame <- frame[order(frame[["Intensity"]],decreasing = TRUE),]
>   # Establish output frame using the most intense candidate
>   newframe <- frame[1,]
>   # Establish overlap-checking vector using the most intense candidate
>   lowppm <- round(newframe[1,][["Mass"]]-newframe[1,
>[["Mass"]]/1E6*ppmrange,digits=digit)
>   highppm <- round(newframe[1,][["Mass"]]+newframe[1,
>[["Mass"]]/1E6*ppmrange,digits=digit)
>   presence <- seq(from=lowppm,to=highppm,by=10^(-digit))
>   # Walk through the entire original frame and check whether peaks are
>overlap-free ... do so until max of 2000 entries
>   for (int in seq(from=2,to=nrow(frame))) {
>     if(nrow(newframe) < 2000) {
>       lowppm <- round(frame[int,][["Mass"]]-frame[int,
>[["Mass"]]/1E6*ppmrange,digits=digit)
>       highppm <- round(frame[int,][["Mass"]]+frame[int,
>[["Mass"]]/1E6*ppmrange,digits=digit)
>       windowrange <- seq(from=lowppm,to=highppm,by=10^(-digit))
>       if (sum(round(windowrange,digits=digit) %in%
>round(presence,digits=digit)) < 1) {
>         newframe <- rbind(newframe,frame[int,])
>         presence <- c(presence,windowrange)
>       }
>     } else {
>       break()
>     }
>   }

Michael Dewey
http://www.aghmed.fsnet.co.uk

```