[R] R help on loops

Berend Hasselman bhh at xs4all.nl
Fri Jun 7 11:24:36 CEST 2013


On 07-06-2013, at 10:59, Laz <lmramba at ufl.edu> wrote:

> Dear R users,
> 
> I am stuck here: My first function returns a vector of 5 values.
> In my second function, I want to repeat this, a number of times, say 10 
> so that I have 10 rows and five columns but I keep on getting errors.
> 
> See the code and results below:
> 
> optm <-function(perm, verbose = FALSE)
> {
>   trace<-c()
>   for (k in 1:perm){
> trace[k]<-Rspatswap(rhox=0.6,rhoy=0.6,sigmasqG=0.081,SsqR=1)[1]
>     perm[k]<-k
>     mat<-cbind(trace, perm = seq(perm))
>   }
>   if (verbose){
>     cat("***starting matrix\n")
>     print(mat)
>   }
>   # iterate till done
>   while(nrow(mat) > 1){
>     high <- diff(mat[, 'trace']) > 0
>     if (!any(high)) break  # done
>     # find which one to delete
>     delete <- which.max(high) + 1L
>     mat <- mat[-delete, ]
>     newmat<-apply(mat,2,mean)[1]
>     sdm<-sd(mat[,1])
>     sem<-sdm/sqrt(nrow(mat))
>     maxv<-mat[1,1]
>     minv<-mat[nrow(mat),1]
>       }
>   stats<-cbind(average=newmat,sd=sdm,se=sem,min=minv,max=maxv)
>   stats
> }
> 
>> test<-optm(perm=20)
>> test
>         average           sd           se       min      max
> trace 0.8880286 0.0009178193 0.0004589096 0.8870152 0.889241
> 
> 
> itn<-function(it){
> siml<-matrix(NA,ncol=5,nrow=length(it))
>   for(g in 1:it){
>    siml[g]<-optm(perm=20)
>   }
> siml<-cbind(siml=siml)
> siml
> }
> 
>> ans<-itn(5)
> Warning messages:
> 1: In siml[g] <- optm(perm = 20) :
>   number of items to replace is not a multiple of replacement length
> 2: In siml[g] <- optm(perm = 20) :
>   number of items to replace is not a multiple of replacement length
> 3: In siml[g] <- optm(perm = 20) :
>   number of items to replace is not a multiple of replacement length
> 4: In siml[g] <- optm(perm = 20) :
>   number of items to replace is not a multiple of replacement length
> 5: In siml[g] <- optm(perm = 20) :
>   number of items to replace is not a multiple of replacement length
>> ans
>           [,1]      [,2]      [,3]      [,4]      [,5]
> [1,] 0.8874234 0.8861666 0.8880521 0.8870958 0.8876469
> 


1. Not reproducible code. Where does function Rspatswap come from?

2. You have several errors in function itn:
    Argument it is a scalar: length(it) is 1. You need to do siml <- matrix(NA,ncol=5,nrow=it)
Next in the g-loop you want to fill row g so do: siml[g,] <- …..

Finally why are you doing siml <- cbind(siml=siml)?
Seems superfluous to me. Delete the line.

Berend



More information about the R-help mailing list