【问题标题】:function not filling empty vector in R函数不填充 R 中的空向量
【发布时间】: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


【解决方案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]]

现在我不认为我使用它的方式完全符合您的最终意图,但也许这足以让您获得您真正想要的东西。

【讨论】:

  • 不,我没有收到错误,只是模拟结果向量没有从复制的模拟函数中获取输出。模拟函数输出一个变长的向量,并且运行良好,问题是 cbind 和 replicate 的组合没有填充 NULL 向量
  • simulation "输出一个可变长度的向量" 假设这是一个数字或整数向量,如果长度发生变化,您将永远无法 cbind 它到任何东西。您可以将其连接到现有结果:simulated_results &lt;- c(),然后将 cbind 更改为 c,但这会为您提供一个包含所有输出的长向量。如果这不是您想要的,您可能需要使用list,它可以包含不同长度的元素。见?list
  • @user1987097 你能让它按照你想要的方式工作吗?
猜你喜欢
  • 2021-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 2020-08-14
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多