Я работаю над документом 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