首页 > 解决方案 > For循环:要替换的项目数不是替换长度的倍数

问题描述

我正在使用 DICE(气候经济)模型处理 R Markdown 文档。

我有一个函数 YPC,它取决于两个变量 tt 和 r。我的目标是获得一个数据框,其中包含 YPC 的所有可能图像(对于 r 和 tt 的所有可能值),其中单元格 YPC[i,j] 包含对于 i=tt 和 j=r 的 YPC 值。对于矩阵的每一行(每个 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”和警告消息:要替换的项目数不是替换长度的倍数。在计算结束时,我得到一个“没有循环中断/下一个,跳转到顶层”错误。

我不会在这里写我所有的代码,因为它很长而且只有很少的元素看起来相关。

此外,由于我在这里不使用常规数据集,因此很难提供可重现的示例。我只有模型参数的简单数据,我的代码在此基础上创建几个使用这些参数的方程。

编辑

感谢您的回答。

以下是 fYPC 的定义方式:

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。

在else部分,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

标签: r

解决方案


推荐阅读