user124123
user124123

Reputation: 1683

function not filling empty vector in R

I'm to get the vector simualted_results to take values returned by "simulation," which produced a vector of varying length depending on the iteration.

Initially I have this code which works, but is very slow:

simulated_results<-NULL
while(as.numeric(Sys.time())-start<duration){
  simulated_results <- cbind(simulated_results,simulation(J,4* (length(J)^2),0.0007,duration,start))

 }

But its very slow so I modified it:

start<-as.numeric(Sys.time())
duration<-10
simulated_results<-NULL
simulated_results <- cbind(simulated_results,
                       replicate(n=10000,expr=(while(as.numeric(Sys.time())-start<duration)
                         {simulation(J,4*(length(J)^2),0.0007,duration,start)})))

Now with the new code, my problem is that despite everything running, I cant get the results of simulation to be passed to simualted_results, instead simualted_results jsut takes on a column vector of NULL values I get no error messages

I would greatly appreciate any help!!

for reference the simulation code is:

iter<-as.numeric(Sys.getenv("PBS_ARRAY_INDEX"))

if(iter <= 40){J<-1:500
}else if(iter <= 80){J<-1:1500
}else if(iter <= 120){J<-1:2500
}else if(iter <= 160){J<-1:5000}

set.seed(iter)
simulation <- function(J,gens,v=0.1,duration,start){

  species_richness <- function(J){
    a <- table(J)
    return(NROW(a))
  }

  start<-as.numeric(Sys.time())

  species_richness_output <- rep(NA,gens)
  for(rep in 1:gens){

    if (as.numeric(Sys.time())-start<duration){

      index1 <- sample(1:length(J),1)

      if(runif(1,0,1) < v){
        J[index1] <- (rep+100)
      } 
      else{
        index2 <- sample(1:length(J),1)
        while(index1==index2) {
          index2 <- sample(1:length(J),1)
        }
        J[index1] <- J[index2]
      }
      species_richness_output[rep] <- species_richness(J)} else break
  }

  species_abundance <- function(J){
    a <- table(J)
    return(a)
  }

  abuntable <- species_abundance(J)

  octaves <- function(abuntable)
  {
    oct<-rep(0,floor(log2(length(J))+1))

    for(i in 1:length(abuntable)){
      oct2 <- floor(log2(abuntable[i])+1)
      oct[oct2] <- oct[oct2]+1
    }

    return(oct)
  }   

  octaves(abuntable)
}

Upvotes: 0

Views: 724

Answers (1)

Bryan Hanson
Bryan Hanson

Reputation: 6213

I agree with @Nathan G, but something did catch my attention: You are trying to cbind two things that cannot be bound together, since they have different dimensions. We don't know what kind of data type your simulation function returns, but it clearly is not NULL. Consider this:

df1 <- NULL
df2 <- data.frame(x = 1:10, y = 11:20)
cbind(df1, df2)
cbind(df2, df1)

Both cbind statements give errors. Do you get an error? If this is what's going on, you should initialize simulated_results not as NULL but as an empty version of whatever the function simulation returns.

EDIT

iter = 10
set.seed(iter)
J <- 1:1500
# critical to preallocate the list size for speed
res <- vector("list", iter)
for (i in 1: iter) {
    res[[i]] <- simulation(J,4* (length(J)^2),0.0007,duration = 10,start)
}
str(res)
res[[1]]

Now I don't think I'm using this quite the way you ultimately intend, but perhaps this will give you enough to get to what you actually want.

Upvotes: 1

Related Questions