R: LIST function and LOOPS
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