0

ベクトルsimualted_resultsを取得して、「シミュレーション」によって返された値を取得します。これにより、反復に応じてさまざまな長さのベクトルが生成されます。

最初は動作するこのコードがありますが、非常に遅いです:

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))

 }

しかし、それは非常に遅いので、私はそれを変更しました:

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)})))

新しいコードでは、すべてが実行されているにもかかわらず、シミュレーションの結果をsimualted_resultsに渡すことができず、代わりにsimualted_resultsjsutがNULL値の列ベクトルを取得するという問題があります。エラーメッセージは表示されません。

助けていただければ幸いです!!

参考までに、シミュレーションコードは次のとおりです。

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)
}
4

1 に答える 1

1

@Nathan Gに同意しますが、何かが私の注意を引きましたcbind。次元が異なるため、結合できない2つのことを試みています。関数が返すデータ型の種類はわかりませんsimulationが、明らかにそうではありませんNULL。このことを考慮:

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

どちらのcbindステートメントもエラーになります。エラーが発生しますか?これが起こっている場合は、関数が返すものの空のバージョンとしてでsimulated_resultsはなく、空のバージョンとして初期化する必要があります。NULLsimulation

編集

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]]

今、私はこれをあなたが最終的に意図する方法で使用しているとは思いませんが、おそらくこれはあなたが実際に望むものに到達するのに十分なものになるでしょう。

于 2013-02-02T16:29:18.287 に答える