我要使用矢量simualted_results来获取“simulation”返回的值,它会根据迭代产生不同长度的矢量。
最初我有这个代码可以工作,但速度很慢:
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)
}
答案 0 :(得分:1)
我同意@Nathan G,但有些事情引起了我的注意:你正试图cbind
两件不能捆绑在一起的东西,因为它们有不同的尺寸。我们不知道您的simulation
函数返回的数据类型是什么类型,但显然不是NULL
。考虑一下:
df1 <- NULL
df2 <- data.frame(x = 1:10, y = 11:20)
cbind(df1, df2)
cbind(df2, df1)
两个cbind
语句都会出错。你收到错误了吗?如果这是正在发生的事情,您应该将simulated_results
初始化为NULL
,而不是将函数simulation
返回的空版本。
修改强>
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]]
现在我认为我没有像你最终想要的那样使用它,但也许这会让你足以达到你真正想要的东西。