[R] Avoiding for loops

Boris Steipe
Sun, 25 Oct 2015 12:21:44 -0000

Sorry - I just noticed you actually have an error in your code: you had
parentheses everywhere they were not needed and I overlooked you had not put
them where they actually are needed. It has to be for (i in 1:(m-1)) ..., not as
you wrote. I'm sure you'll understand the difference.

d <- numeric(m-1)
for (i in 1:(m-1)) {
    d[i] <- n - sum(x[1:i]) - i
}

B.

On Oct 25, 2015, at 8:13 AM, Boris Steipe <boris.steipe at utoronto.ca>
wrote:

> If this code is slow it is not because you are using loops, but because you
are dynamically building your vectors and lists and their size needs to change
with each iteration causing significant unnecessary computational overhead. If
you simply do something like
>
> d <- numeric(m-1)
> for (i in 1:m-1) {
>  d[i] <- n - sum(x[1:i]) - i
> }
>
> for all of your loops, you will see already see very significant speedup.
(If you look at my code formatting, and compare it with your own you may also
benefit.) The bottom line: the point is not to avoid for-loops, but to speed up
your code.
>
> Nb. if you want to avoid loops for some aesthetic reason, read about
apply() and its siblings,  and experiment with it. Of course, internally an
apply() statement uses loops...
>
> NNb: Do you know how to profile your code? How do you know which part of
your code is actually slowing it down?
>
>
>
> B.
>
>
>
>
> On Oct 25, 2015, at 6:42 AM, Maram SAlem <marammagdysalem at
gmail.com> wrote:
>
>> Hi All,
>>
>> I wonder if I can avoid the for() loop in any of the following
loops.These
>> loops are a part of a larger code which I'm trying to accelerate.
>>
>> n=6
>> m=4
>> x<-c(0,1,1)
>>
>> 1st loop
>>
>> for (i in 1:m-1)
>>  {
>>  d[i]<- n- (sum(x[(1):(i)])) - i
>>  }
>> e<- n*(prod(d))
>>
>>
>> 2nd loop
>>
>> LD<-list()
>>  for (i in 1:(m-1))
>>  {
>>  LD[[i]]<-seq(0,x[i],1)
>>  }
>>
>>  LD[[m]]<-seq(0,(n-m-sum(x)),1)
>>  LED<-expand.grid (LD)
>>  LED<-as.matrix(LED)
>>
>>
>> 3rd loop
>>
>> for (i in 1:(m-1))
>>
>>  {
>>
>>   h[i]<- choose(x[i],LED[j,i])
>>
>>    }
>>
>>
>>
>> 4th loop
>>
>>
>> for (i in 1:(m-1))
>>
>> {
>>
>>   lm[i]<-(sum(LED[j,1:i])) + i
>>
>>     }
>>
>>
>> I appreciate if anyone has any suggestions or references.
>>
>>
>> Thanks in advance.
>>
>>
>> Maram Salem
>>
>> 	[[alternative HTML version deleted]]
>>
>> ______________________________________________
>> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
>> 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.
>