# [R] Result depends on previous result; easy with a loop; but without a loop?

Roland Rau roland.rproject at gmail.com
Fri Dec 14 20:33:04 CET 2007

```Dear all,

in the meantime, I found a solution -- thank to a suggestion sent by
Mark Leeds to me off-list.

All the best,
Roland

set.seed(1234)
initial.matrix <- rbind(rep(1,4), matrix(0,ncol=4,nrow=5))
the.other.matrix <- matrix(runif(20), ncol=4, nrow=5)
for (i in 2:(nrow(initial.matrix))) {
initial.matrix[i,] <- initial.matrix[i-1,]*the.other.matrix[i-1,]
}
### that is how it should look like:
initial.matrix

### this is Mark's suggestion (if I understood it correctly)
initial.matrix2 <- rbind(rep(1,4), matrix(1,ncol=4,nrow=5))
initial.matrix2[-1,] <- sapply(1:ncol(initial.matrix2),
function(.col) {
cumprod(initial.matrix2[-(nrow(initial.matrix2)),.col]
* the.other.matrix[,.col])
}
)
## and it works!!!
initial.matrix2
## yes, I know, such comparisons of floats are notoriously problematic

Roland Rau wrote:
> Dear all,
>
> I am pretty sure that this has been discussed before. Unfortunately, I
> can not find anything in the archives -- probably because I am
> "RSiteSearching" for the wrong terms. If I remember correctly, I think I
> even asked this question a few years ago. But I cannot even find this.
>
> The basic problem is that a result depends on a previous result. This is
> easy with a loop--but how can I do this without a loop?
>
> Lets give an example:
>
> initial.matrix <- rbind(rep(1,4), matrix(0,ncol=4,nrow=5))
> the.other.matrix <- matrix(runif(20), ncol=4, nrow=5)
>
> the initial matrix should be filled according to the following
> (pseudo-code) rule:
> if (row==1) initial.matrix[1,] <- 1
> if (row>1) initial.matrix[x,] <- initial.matrix[x-1,] *
> the.other.matrix[x-1,]
>
> as I said this is easy to do with a loop:
> for (i in 2:(nrow(initial.matrix))) {
>    initial.matrix[i,] <- initial.matrix[i-1,]*the.other.matrix[i-1,]
> }
> initial.matrix
>
> But how can I do this without a loop?
>