[R] lapply() reccursively

Kaveh Vakili kaveh.vakili at ulb.ac.be
Tue Oct 13 20:19:51 CEST 2009

```Thanks, Chuck's answer is the closest to what i want (gives the same result as cumprod()) ...but using this function seems actually slower than the loop (is it normal ?):

a1<-runif(100000)
cadd<-function(x) Reduce("*", x, accumulate = TRUE)
looop<-function(a1){
j<-length(a1)
for(i in 2:j){
a1[i]<-a1[i-1]*a1[i]
}
a1
}
>>
>   user  system elapsed
>  1.344   0.004   1.353
>> system.time(cumprod(a1))
>   user  system elapsed
>  0.004   0.000   0.002
>> system.time(looop(a1))
>   user  system elapsed
>  0.772   0.000   0.775
>>
>
>
>>On Tue, 13 Oct 2009, Kaveh Vakili wrote:
>>
>>>
>>> Hi all,
>>>
>>> I was wondering whether it is possible to use the lapply() function
>>> to alter the value of the input, something in the spirit of :
>>>
>>> a1<-runif(100)
>>> a2<-function(i){
>>> a1[i]<-a1[i-1]*a1[i];a1[i]
>>> }
>>> a3<-lapply(2:100,a2)
>>>
>>> Something akin to a for() loop, but using the lapply() infrastructure.
>>> I haven't been able to get rapply() to do this.
>>
>>Maybe you want to check out
>>
>> 	?Reduce
>>
>>For the example above, something like
>>
>>a3 <-  Reduce( "*", a1, accumulate = TRUE )
>>
>>
>>HTH,
>>
>>Chuck
>>
>>>
>>> The reason is that the "real" a2 function is a difficult function that only needs to be evaluated if the value of a1[i-1] meets some criteria.
>>>
>>>
>>> ______________________________________________
>>> R-help at r-project.org mailing list
>>> https://stat.ethz.ch/mailman/listinfo/r-help
>>> and provide commented, minimal, self-contained, reproducible code.
>>>
>>
>>Charles C. Berry                            (858) 534-2098
>>                                             Dept of Family/Preventive Medicine
>>E mailto:cberry at tajo.ucsd.edu	            UC San Diego
>>http://famprevmed.ucsd.edu/faculty/cberry/  La Jolla, San Diego 92093-0901
>>
>>
>>
>>
>
>
>
>

```