我要獲得向量simualted_results以獲取由「simulation」返回的值,該值根據迭代生成了長度不定的向量。函數不填充R中的空向量
起初,我有這個代碼的工作,但速度很慢:
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_results jsut採用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)
}
這裏有很多問題。你的代碼混亂不清,我們沒有'simulation()'函數,即使我們做了,它看起來像你使用組合cbind()。 .replicate().. simulation()非常不正確。即使是描述問題的段落也是不連貫的。如果沒有清楚地描述數據以及如何操縱數據,您不可能獲得任何幫助。 – N8TRO
您也可以使用您的舊代碼,並預先分配您的結果所需的數據結構。緩慢來自內存不斷重新分配,隨着對象的增長。 –
我想我們需要看看'simulation()'知道如何幫助你。在全球環境中「J」嗎? –