Для L oop: количество заменяемых элементов не кратно длине замены - PullRequest
1 голос
/ 22 апреля 2020

Я работаю над документом R Markdown с использованием модели DICE (климат-экономика).

У меня есть функция YP C, которая зависит от двух переменных tt и r. Моя цель - получить фрейм данных, который содержит все возможные изображения YP C (для всех возможных значений r и tt), с ячейкой YPC [i, j], содержащей значение YP C для i = tt и j = r. Для каждой строки моей матрицы (каждое значение tt) я хочу, чтобы каждая ячейка после определенного значения r = l [tt] была заполнена значением 0.

Пример: l [1] = 100; Затем все ячейки в первой строке после 100-го столбца должны быть заполнены нулями.

Я создаю свою матрицу и определяю ее ячейки следующим образом

YPC<-matrix(nrow = NT, ncol = l[100])
for (i in 1:NT){
for (j in 1:l[100]) {
        if (j<=l[i]) {
    YPC[i,j] <- fYPC(Y, r=j, tt=i)}
    else{
       YPC[i,j] <- 0}
  }
}

Когда я печатаю сгенерированные ячейки, я вижу, что она прекрасно работает до значения l [i]. При значении l [i] выводится «Inf» и предупреждающее сообщение: количество заменяемых элементов не кратно длине замены. В конце вычисления я получаю ошибку «нет l oop для перерыва / следующего перехода на верхний уровень».

Я не пишу здесь весь свой код, так как он довольно длинный и единственный некоторые элементы кажутся релевантными.

Кроме того, трудно привести воспроизводимый пример, поскольку я не использую здесь обычный набор данных. У меня есть только простые данные для параметров модели, на которой построен мой код для создания нескольких уравнений, использующих эти параметры.

РЕДАКТИРОВАТЬ

Спасибо за ваши ответы.

Вот как определяется fYP C:

fYPC <- function(Y, r, tt=NULL){
 if (is.null(tt)){
    output=(exp(Y/l+et2*sqrt(2)*erfinv(2*r/l-1))+exp(Y/l+et2*sqrt(2)*erfinv(2(r-1)/l-1)))
  }else {
    output=(exp(Y[tt]/l[tt]+et2*sqrt(2)*erfinv(2*r/l[tt]-1))+exp(Y[tt]/l[tt]+et2*sqrt(2)*erfinv(2*(r-1)/l[tt]-1)))
  }
return(output)
}

В части is.null Y является значением, поэтому выход также имеет длину 1.

В другой части Y является вектор, тогда Y [tt] и l [tt] имеют длину 1 и, таким образом, является окончательным выводом. О NT вы можете заменить его на 100. И l [i] определяется следующим образом (с pop0, popasym, popadj соответственно 100, 1000, 0,134):

l = pop0 
for(i in 2:NT) l[i] <- l[i-1] * (popasym / l[i-1])**popadj
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...