Цикл for работает, пока не вложен в другой цикл for, повторяя значения NA - PullRequest
1 голос
/ 11 июня 2019

Мне нужно смоделировать и затем суммировать прибыль за 10 лет, где первый год имеет дополнительные расходы;Мне также нужно увидеть это на нескольких заводах с разными мощностями.Я предполагал, что вложенный цикл будет самым простым способом сделать эту работу.

Возможности заводов, через которые я хочу пройти: 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 Ответ

1 голос
/ 11 июня 2019

Поместите ваш код в функцию. Затем с помощью некоторой семейной функции 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

Edit:

Измените функцию, заменив Profit = sum(c(Pr1, Pr2)) на Profit = c(Pr1, Pr2,sum(Pr1,Pr2)), и вы получите полную таблицу симуляций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...