在R中无限运行嵌套for和while循环时遇到问题

时间:2013-09-20 22:00:58

标签: r

我正在尝试模拟每年人口快速或缓慢增长的人口,最大规模为5000人。然后我在运行此循环5000次以查看时间变化为5000。

然而,循环只是继续运行,我必须手动停止。

奇怪的是,popVector是一个记录每一轮人口规模的向量,增长到一个巨大的规模,往往成千上万,我不会从数字中预测出来我正在使用。

非常感谢任何解决此问题的帮助!

MAXPOP <- 5000 #Set max population
trials <- 5000
genVector <- numeric(trials)
set.seed(1)

for(j in 1:trials) {
  curr_pop <- 20 #Set initial population
  genTime <- 1
  popVector <- curr_pop;
  while(curr_pop <= MAXPOP) {
    if(genTime%%2 == 0) {
      p <- 0.25
    }
    if(genTime%%2 != 0) {
      p <- 0.5
    }
    curr_pop <- sum(rgeom(curr_pop, p)) #Set current population
    popVector <- c(popVector, curr_pop)
    genTime <- genTime + 1
  }
  genVector[j] <- genTime
}

2 个答案:

答案 0 :(得分:1)

问题似乎出现在你的while循环中。当我运行代码时,curr_pop会在for循环的2826次迭代中将设置为零。我对rgeom函数不够熟悉,但这是调查导致它返回零的原因。

答案 1 :(得分:0)

rgeom函数返回一个随机数向量,其元素与第一个参数一样多。使用小的第一个参数,第二个参数接近1,它返回一组全零之前是一个时间问题,之后curr_pop <- sum(rgeom(curr_pop, p))将永远保持为0。

您可以通过在while循环中包装该调用以检查0 sum并将curr_pop重置为其他内容来解决此问题,例如:

while (T) {
    curr_pop <- sum(rgeom(curr_pop, p)) #Set current population
    if (curr_pop > 0) break
    else curr_pop <- 1
}

@ Havik23提到的迭代步骤2826是因为set.seed(1)调用。这样,将始终生成相同的随机数序列。如果您希望自己的程序更随机,则可能需要注释掉该通话。