[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[1] <- p[1]
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[1] <- p[1]
>> 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[1] <- p[1]
> + for (i in c(2:length(p))) {
> + x[i] <- 0.8*p[i] + 0.2*p[i-1]
> + }
> + return (x)
> + }
>>
>> myfunc(1:10)
> Error in myfunc(1:10) : Object "x" not found
>
>
> 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
More information about the R-help
mailing list