# [R] unavoidable loop? a better way??

James Muller james.muller at anu.edu.au
Sat Nov 13 08:17:29 CET 2004

```Take 3:

# p is a vector
myfunc <- function (p) {
x <- rep(0,length(p))
x <- p
for (i in c(2:length(p))) {
x[i] <- 0.8*p[i] + 0.2*x[i-1]   # note the x in the last term
}
return (x)
}

James

On Sat, 13 Nov 2004 01:12:50 -0600, Deepayan Sarkar
<deepayan at stat.wisc.edu> wrote:

> On Saturday 13 November 2004 00:51, James Muller wrote:
>> Hi all, I have the following problem, best expressed by my present
>> solution:
>>
>> # p is a vector
>> myfunc <- function (p) {
>>    x <- p
>>    for (i in c(2:length(p))) {
>>      x[i] <- 0.8*p[i] + 0.2*p[i-1]
>>    }
>>    return (x)
>> }
>
> Does this work at all? I get
>
>> myfunc <- function (p) {
> +    x <- p
> +    for (i in c(2:length(p))) {
> +      x[i] <- 0.8*p[i] + 0.2*p[i-1]
> +    }
> +    return (x)
> + }
>>
>> myfunc(1:10)
>
>
> Anyway, simple loops are almost always avoidable. e.g.,
>
> myfunc <- function (p) {
>    x <- p
>    x[-1] <- 0.8 * p[-1] + 0.2 * p[-length(p)]
>    x
> }
>
> Deepayan
>
>>
>> That is, I'm calculating a time-weighted average. Unfortunately the
>> scale of the problem is big. length(p) in this case is such that each
>> call takes about 6 seconds, and I have to call it about 2000 times
>> (~3 hours). And, I'd like to do this each day. Thus, a more efficient
>> method is desirable.
>>
>> Of course, this could be done faster by writing it in c, but I want
>> to avoid doing that if there already exists something internal to do
>> the operation quickly (because I've never programmed c for use in R).
>>
>> Can anybody offer a solution?
>>
>> I apologise if this is a naive question.
>>
>> James

```