r for循环没有超过第一次迭代

时间:2018-05-01 00:25:50

标签: r for-loop

这是更大代码的一部分,但由于某种原因,我在我的for循环中遇到了一个奇怪的错误,这是我以前从未见过的。出于某种原因,循环在第一次迭代后卡住了,并且在剩余的27次循环中没有进展。没有错误,只是一个未完成的工作。这是我正在使用的代码:

year = c(1970, 1971, 1972, 1973, 1974, 1975, 1976, 1977, 1978, 1979, 1980, 1981, 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998)

catch = c(1138, 1183, 1380, 1672, 666, 973, 1118, 2900, 3599, 4218, 5124, 5559, 4891, 5751, 4525, 3592, 2682, 3617, 3458, 3173, 3550, 3987, 3084, 2515, 3162, 4125, 2311, 2694, 3250)

n = length(year)

ssq_CPUE = function(B0, r_input, p_input, K_input) {
  pred_B = rep(0, length(year))


  # scaling inputs
  B0 = B0*1000
  r_input = r_input/100
  p_input = p_input/1000000000
  K_input = K_input*1000
  # expected biomass

  pred_B[1] = B0
  for(i in 2:n){


      pred_B[i] = max(pred_B[i-1] + (r_input/p_input) * pred_B[i-1] * (1-(pred_B[i-1]/K_input)^p_input) - catch[i-1], 100)

    return(pred_B)
  }
}

当我输入

ssq_CPUE(B0 = 42, r_input = 30, p_input = 1, K_input = 27)

我得到以下矢量:

 [1] 42000.00 35294.91     0.00     0.00     0.00     0.00     0.00     0.00     0.00     0.00     0.00
[12]     0.00     0.00     0.00     0.00     0.00     0.00     0.00     0.00     0.00     0.00     0.00
[23]     0.00     0.00     0.00     0.00     0.00     0.00     0.00

它正确地贯穿循环的第一次迭代,但没有剩余的循环。超级奇怪,我不知道为什么。

1 个答案:

答案 0 :(得分:1)

你有一个小错字。代码应该是:

year = c(1970,1971,1972,1973,1974,1975,1976,1977,1978,1979,          1980年,1981年,1982年,1983年,1984年,1985年,1986年,1987年,1988年,1989年,          1990年,1991年,1992年,1993年,1994年,1995年,1996年,1997年,1998年)

ssq_CPUE = function(B0, r_input, p_input, K_input) {
  pred_B = rep(0, length(year))


  # scaling inputs
  B0 = B0*1000
  r_input = r_input/100
  p_input = p_input/1000000000
  K_input = K_input*1000
  # expected biomass

  pred_B[1] = B0
  for(i in 2:n){
    pred_B[i] = max(pred_B[i-1] + (r_input/p_input) * pred_B[i-1] * 
                      (1-(pred_B[i-1]/K_input)^p_input) - catch[i-1], 100)
  }

  # This statement needs to be at the end of the function definition
  return(pred_B)
}