如何让这个嵌套for循环正常工作?

时间:2015-09-07 00:12:56

标签: r

我正在尝试创建一个模拟,我观察森林生长了200年。我的森林里有25棵树。目标是每棵树的生物量为1,然后每年保持活力,生物量增加600。如果它死了,它会恢复到0生物量。我现在遇到的问题是我的树木都互相模仿,它们没有单独生长。任何帮助表示赞赏。我在Windows 7上运行R版本3.2.1。

simulation_years = 200
num_trees_side1 = 5
num_trees_side2 = 5
npp=600
mortality=0.02
forest = array(0,dim=c(simulation_years,num_trees_side1,num_trees_side2))
forest[1,,] = 1

for(i in 2:simulation_years){
    for(j in 1:num_trees_side1){  
     for(k in 1:num_trees_side2){
           forest[i,,] = forest[i] + npp
             rvar = runif(1,0,1)
        if(rvar < mortality){  
            forest[i,,] = 0} }}}

1 个答案:

答案 0 :(得分:0)

您的问题在这里forest[i,,]=0 - 只要有死亡事件,您就会将整个“方面”重置为0。这应该是forest[i,j,k] = 0

此外,您不需要所有这些for循环。你的问题只是在一个维度上真正递归 - 时间 - 其他两个维度可以一次处理。这是我如何解决你的问题:

num_trees = num_trees_side1 * num_trees_side2
for(i in 2:simulation_years){
  deaths=matrix(runif(num_trees)>mortality,
                ncol=num_trees_side2)
  forest[i,,] = deaths*(forest[i-1L,,]+
                          npp*(forest[i-1L,,]>0))
}

让我们通过一个simulation_years=2的例子。

set.seed(10239) #so we both get the same random numbers

在我们运行上面的代码之后,我们可以通过查看deaths

来查看哪些树死亡了
> deaths
      [,1] [,2] [,3]  [,4] [,5]
[1,]  TRUE TRUE TRUE  TRUE TRUE
[2,]  TRUE TRUE TRUE  TRUE TRUE
[3,]  TRUE TRUE TRUE  TRUE TRUE
[4,]  TRUE TRUE TRUE  TRUE TRUE
[5,] FALSE TRUE TRUE FALSE TRUE

因此,[5,1][5,4]处的树木已经死亡。让我们通过查看forest[2,,]

来查看生物量
> forest[2,,]
     [,1] [,2] [,3] [,4] [,5]
[1,]  601  601  601  601  601
[2,]  601  601  601  601  601
[3,]  601  601  601  601  601
[4,]  601  601  601  601  601
[5,]    0  601  601    0  601

根据需要,[5,1][5,4]处的两棵树已经死亡;其余的都增加了600。