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)
[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
[1] -2.213343
[1] -2.904235
[1] -0.01516304
[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
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