[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
}
>>
>> system.time(cadd(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.
>>>
>>> Thanks in advance,
>>>
>>> ______________________________________________
>>> R-help at r-project.org mailing list
>>> 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.
>>>
>>
>>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
>>
>>
>>
>>
>
>
>
>
More information about the R-help
mailing list