For循环有效,直到嵌套在另一个for循环中,然后重复NA值

时间:2019-06-11 17:12:35

标签: r

我需要模拟然后总结10年的利润,而第一年会有额外的支出;我还需要针对几个具有不同产能的工厂看到这一点。我认为嵌套的for循环将是完成此工作的最简单方法。

我要遍历的工厂的产能: Cap = c(30000, 35000, 40000, 45000, 50000, 55000, 60000)

如果我手动选择其中一种容量,并且仅将其中一种用于循环:

i = 60000
D = rnorm(n=1, mean=50000, sd=12000)
Pr1 = min(D, i)*UnitProf - i*OpCost - i*BuildCost
for (j in 1:9) {
  D = rnorm(n=1, mean=50000, sd=12000)
  Pr2[j] = min(D, i)*UnitProf - i*OpCost 
}
Profit = sum(c(Pr1, Pr2))
Profit

我获得了全部10年利润的单笔金额(例如619775.10),正是我想要的。

但是当我尝试使用嵌套的for循环遍历每个容量时,例如:

Cap = c(30000, 35000, 40000, 45000, 50000, 55000, 60000)

for (i in Cap) {
  D = rnorm(n=1, mean=50000, sd=12000)
  Pr1 = min(D, i)*UnitProf - i*OpCost - i*BuildCost
  for (j in 1:9) {
    D = rnorm(n=1, mean=50000, sd=12000)
    Pr2[j] = min(D, i)*UnitProf - i*OpCost 
  }
  Profit[i] = sum(c(Pr1, Pr2))
}
Profit

我得到619775.10 NA NA NA NA NA NA NA NA …,它重复了数千次。

我想返回的是一个包含7个元素的向量。要素是10年的利润之和,每个工厂一个利润。

1 个答案:

答案 0 :(得分:1)

将代码放入函数中。然后使用一些apply族函数来迭代您的能力向量:

Fprofit = function(i){
D = rnorm(n=1, mean=50000, sd=12000)
Pr1 = min(D, i)*UnitProf - i*OpCost - i*BuildCost
Pr2=c() #Empty
for (j in 1:9) {
  D = rnorm(n=1, mean=50000, sd=12000)
  Pr2[j] = min(D, i)*UnitProf - i*OpCost 
}
Profit = sum(c(Pr1, Pr2))
Profit}
Fprofit(60000)
Cap = c(30000, 35000, 40000, 45000, 50000, 55000, 60000)
set.seed(1234) # for being reproducible
sapply(Cap,Fprofit)

#[1]  577403.3  692650.0  769812.6  767271.6  808360.8  859919.7 1046818.9
      # assuming UnitProf=2 OpCost=.02 BuildCost=0.01

编辑:

更改将功能Profit = sum(c(Pr1, Pr2))替换为Profit = c(Pr1, Pr2,sum(Pr1,Pr2))的功能,您将获得完整的仿真表。