[R] R: LIST function and LOOPS

Clark Allan Allan at STATS.uct.ac.za
Fri Mar 11 13:15:30 CET 2005


hi 

thanx for the help. i dont want to use matrices. i solve my problem, see
the example below.

the set.seed is used because in my actual application i need to generate
INDEPENDENT variables. will this ensure that the variables are
independent? 


z3<-function(w)
{
for (i in 1:w)
{
ss<-0
       for (j in 1:5)
       {
                set.seed(j+1+(i-1)*6)
                r<-rnorm(1)
        	ss<-ss+r
		a<-list(ss=ss,r=r)
       }
print(paste("############ i=",i,"############"))
print(a)
}
}
z3(3)



> z3(3)
[1] "############ i= 1  ############"
$ss
[1] -2.213343

$r
[1] 0.269606

[1] "############ i= 2  ############"
$ss
[1] -2.904235

$r
[1] -1.480568

[1] "############ i= 3  ############"
$ss
[1] -0.01516304

$r
[1] 0.9264592


thanx again

***
allan

###############################################################################################
###############################################################################################
###############################################################################################
###############################################################################################
###############################################################################################
###############################################################################################


Adaikalavan Ramasamy wrote:
> 
> You will need to capture the value of ss at the end of each 'i' as such
> 
> z4 <-function(w){
> 
>   output <- numeric(w)
> 
>   for (i in 1:w){
> 
>     set.seed(i+6)  # this is redundant line
>     ss<-0
> 
>     for (j in 1:5){
>       set.seed(j+1+(i-1)*6)
>       r<-rnorm(1)
>       ss<-ss+r
>     }
> 
>     output[i] <- ss
>   }
>   return(output)
> }
> 
> BTW, I do not think it is a good idea to set.seed() so many times.
> 
> To answer you more general question, see if the following is useful.
> I am trying to simulate 'n' values from a standard normal distribution
> but 'n' is random variable itself.
> 
> f <-function(w, lambda=3){
> 
>   tmp <- list(NULL)
> 
>   for (i in 1:w){
>     n <- 1 + rpois(1, lambda=lambda)  # number of simulation required
>     tmp[[ i ]]  <- rnorm(n)
>   }
> 
>   # flatten the list into a ragged matrix
>   out.lengths   <- sapply(tmp, length)
>   out           <- matrix( nr=w, nc=max( out.lengths ) )
>   rownames(out) <- paste("w =", 1:w)
>   for(i in 1:w) out[i, 1:out.lengths[i] ] <- tmp[[i]]
> 
>   return(out)
> }
> 
> f(6, lambda=3)
> 
> It is not very elegant but I hope that helps you out somehow.
> 
> Regards, Adai
> 
> On Thu, 2005-03-10 at 10:16 +0200, Clark Allan wrote:
> > hi all
> >
> > another simple question.
> >
> > i've written a dummy program so that you get the concept. (the code
> > could be simplfied such that there are no loops. but lets leave the
> > loops in for now.)
> >
> > z1<-function(w)
> > {
> > for (i in 1:w)
> > {
> > set.seed(i+6)
> > ss<-0
> >       for (j in 1:5)
> >       {
> >               set.seed(j+1+(i-1)*6)
> >               r<-rnorm(1)
> >               ss<-ss+r
> >       }
> > list(ss=ss)
> > }
> > }
> > check.1<-z1(3)
> > check.1
> >
> > the results is:
> > $ss
> > [1] -0.01516304
> >
> >
> > what i want is something that looks like this:
> >
> > j=1
> > $ss
> > [1] -2.213343
> >
> > j=2
> > $ss
> > [1] -2.904235
> >
> > j=3
> > $ss
> > [1] -0.01516304
> >
> >
> > i know that i could use the print command. (see z2)
> >
> > z2<-function(w)
> > {
> > for (i in 1:w)
> > {
> > set.seed(i+6)
> > ss<-0
> >       for (j in 1:5)
> >       {
> >               set.seed(j+1+(i-1)*6)
> >               r<-rnorm(1)
> >               ss<-ss+r
> >       }
> > print(ss)
> > }
> > }
> > check.2<-z2(3)
> > check.2
> >
> > > check.2<-z2(3)
> > [1] -2.213343
> > [1] -2.904235
> > [1] -0.01516304
> > > check.2
> > [1] -0.01516304
> >
> > the problem with z2 is that only the last value is saved.
> >
> >
> > what i could do is use matrices like the following: (but i dont want to
> > do this AND WOULD PREFER TO USE list.)
> >
> > z3<-function(w)
> > {
> > results.<-matrix(nrow=w,ncol=1)
> > colnames(results.)<-c("ss")
> > for (i in 1:w)
> > {
> > set.seed(i+6)
> > ss<-0
> >       for (j in 1:5)
> >       {
> >               set.seed(j+1+(i-1)*6)
> >               r<-rnorm(1)
> >               ss<-ss+r
> >       }
> > results.[i,1]<-ss
> > }
> > results.
> > }
> > check.3<-z3(3)
> > check.3
> >
> > > check.3
> >               ss
> > [1,] -2.21334260
> > [2,] -2.90423463
> > [3,] -0.01516304
> >
> > what if i have a new program (something different) and i want the
> > following:
> >
> > j=1
> > $a
> > 1
> > 2
> > 3
> >
> > $b
> > 1
> > 2
> > 3
> > 4
> > 5
> >
> > $c
> > 1
> >
> >
> > ###############
> > j=2
> > $a
> > 11
> > 21
> > 31
> >
> > $b
> > 11
> > 21
> > 31
> > 41
> > 51
> >
> > $c
> > 11
> >
> > ###############
> > j=3
> > $a
> > 21
> > 22
> > 32
> >
> > $b
> > 21
> > 22
> > 32
> > 42
> > 52
> >
> > $c
> > 21
> >
> > MATRICES SEEMS TO BE A GOOD WAY OF DOING THIS (but then you would have
> > to set up three matrices, one for a,b and c). BUT WHAT IF I WANT TO USE
> > THE LIST FUNCTION? i.e. there is a list in the first loop that i want to
> > display!
> >
> > sorry for the long mail.
> >
> > ***
> > ALLAN
> > ______________________________________________ R-help at stat.math.ethz.ch mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html


More information about the R-help mailing list