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

Ravi Varadhan rvaradhan at jhmi.edu
Fri Dec 14 20:56:16 CET 2007


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.

----------------------------------------------------------------------------
-------

Ravi Varadhan, Ph.D.

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

Email: rvaradhan at jhmi.edu

Webpage:  http://www.jhsph.edu/agingandhealth/People/Faculty/Varadhan.html

 

----------------------------------------------------------------------------
--------


-----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?
> 
> Thank you already in advance!
> Roland
> 
> ______________________________________________
> 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.



More information about the R-help mailing list