【发布时间】:2013-02-02 16:06:21
【问题描述】:
我要让向量 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_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() 非常不正确。即使您描述问题的段落也不连贯。如果没有清楚地描述您的数据以及您希望如何操作它,您不可能获得任何帮助。
-
您也可以使用旧代码,并为结果预分配所需的数据结构。缓慢来自随着对象的增长不断重新分配内存。
-
我认为我们需要查看
simulation()才能知道如何为您提供帮助。J在全球环境中吗? -
好的,我会把剩下的代码放上去,但这不是问题所在,问题在于 cbind 和 replicate 的组合
-
好的,我运行了
simulation,它返回了一个数字向量。所以你必须使用一个列表来组合你的答案。我将在下面更新我的答案。此外,您不需要start作为参数,它已通过代码修复。
标签: r