簡體   English   中英

在R中無限運行嵌套for和while循環的問題

[英]Having issues with infinitely running nested for and while loops in 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
}

問題似乎出在您的while循環中。 當我運行代碼時,curr_pop在for循環的2826迭代中被設置為零。 我對rgeom函數還不太熟悉,但這是研究導致它返回零的原因的地方。

rgeom函數返回一個隨機數向量,該向量具有與第一個參數一樣多的元素。 在第一個參數較小且第二個參數接近1的情況下,返回一組全零是時間問題,之后curr_pop <- sum(rgeom(curr_pop, p))永遠保持0。

您可以通過在while循環中包裝該調用以檢查0和並將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)調用引起的。 這樣,將始終生成相同的隨機數序列。 如果您希望程序更加隨機 ,則可能需要注釋掉該調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM