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

Date: Fri, 14 Dec 2007 14:56:16 -0500

Roland,

You can test for the "sameness" of floating-point results as follows:

all.equal(initial.matrix, initial.matrix2)

By default, it uses a tolerance = .Machine\$double.eps ^ 0.5 (roughly, 1.e-08). You can decrease this if you want a more stringent test for sameness.

all.identical(initial.matrix, initial.matrix2)

This tests for "identicality", which, of course, is not appropriate for floating point computations.

Ravi.

Assistant Professor, The Center on Aging and Health

Division of Geriatric Medicine and Gerontology

Johns Hopkins University

Ph: (410) 502-2619

Fax: (410) 614-9625

-----Original Message-----
From: r-help-bounces_at_r-project.org [mailto:r-help-bounces_at_r-project.org] On Behalf Of Roland Rau
Sent: Friday, December 14, 2007 2:33 PM
To: 'r-help_at_stat.math.ethz.ch'
Subject: Re: [R] Result depends on previous result; easy with a loop; but without a loop?

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
if (all(initial.matrix==initial.matrix2)) cat("Good\n") else cat("Bad\n") ## 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?
>
> Roland
>
> ______________________________________________
> R-help_at_r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
```

http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. >

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.

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. Received on Fri 14 Dec 2007 - 20:01:19 GMT

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Fri 14 Dec 2007 - 20:30:19 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-help. Please read the posting guide before posting to the list.