[R] Avoiding Loops When Iterating Over Statement That Updates Its Input

Uwe Ligges ligges at statistik.tu-dortmund.de
Sun May 30 20:40:50 CEST 2010



On 30.05.2010 19:23, Alan Lue wrote:
> Is there a performance advantage to doing this, as opposed to growing
> the vector within the loop?  I suppose R could have to dynamically
> reallocate memory at some point?

Right, but that takes time since memory management is always expensive 
(and this way you need memory management in each iteration rather than 
once) and your objects may be copied around all the time.

Uwe Ligges



>
> Alan
>
>
> 2010/5/30 Uwe Ligges<ligges at statistik.tu-dortmund.de>:
>>
>>
>> On 26.05.2010 08:52, Alan Lue wrote:
>>>
>>> Come to think of it, we can't save the output of each invocation and
>>> concatenate it later, since we need the output as input for the next
>>> iteration.
>>
>>
>> Yes, but you can do it a bit cleverer than before by initializing to the
>> fill length as in:
>>
>> r.seq<- numeric(nrow(d))
>> r.seq[1]<- 2 * (1 / d$Dt[1] - 1)
>> for (i in 2:nrow(d)) {
>>   r.seq[i]<- uniroot(bdt.deviation, interval = c(0, 1),
>>                 D.T = d$Dt[i], r.prior = r.seq[i-1])$root
>> }
>>
>> Uwe Ligges
>>
>>
>>
>>> Alan
>>>
>>>
>>> On Tue, May 25, 2010 at 11:43 PM, Alan Lue<alan.lue at gmail.com>    wrote:
>>>>
>>>> Since `for' loops are slow in R, and since `apply' functions are
>>>> faster, I was wondering whether there were a way to use an apply
>>>> function—or to otherwise avoid using a loop—when iterating over a
>>>> statement that updates its input.
>>>>
>>>> For example, here's some such code:
>>>>
>>>> r.seq<- 2 * (1 / d$Dt[1] - 1)
>>>> for (i in 2:nrow(d)) {
>>>>   rf<- uniroot(bdt.deviation, interval=c(0, 1), D.T=d$Dt[i],
>>>> r.prior=r.seq)
>>>>   r.seq<- append(r.seq, rf$root)
>>>> }
>>>>
>>>> The call to `uniroot()' both updates `r.seq' and reads it as input.
>>>> We could save the output of each invocation of `uniroot()' and
>>>> concatenate it later, but is there a better way to write this (i.e.,
>>>> to execute more quickly) while updating `r.seq' in each iteration?
>>>>
>>>> Alan
>>>>
>>>
>>>
>>>
>>
>
>
>



More information about the R-help mailing list