R语言循环执行报‘对象y未找到’,无法生成向量s的调试求助
代码报错修复方案
触发「对象y未找到」的核心原因
- 未提前初始化存储结果的
y、s向量:R中如果当前环境没有y对象,直接执行y[i] <- data.nbin[i]的赋值操作,会直接抛出「对象y未找到」的错误,必须提前给结果对象分配好存储空间。
代码中其他连带的语法、逻辑问题
- 内层
j循环的for语句缺少闭合括号:for (j in (1:length(y[i])){末尾漏了) - 冗余无效逻辑:
j循环全程未使用循环变量j,嵌套完全多余;i=i属于无意义赋值 - 误用
return(s[i]):如果在普通脚本(非自定义函数)中运行,循环内的return语句会直接中断整个脚本执行,根本不会完成10次循环生成完整的s向量 - 变量覆盖问题:预设的时间阈值
t=10.25在循环内部被重新赋值为length(index),后续计算会取错参数值 - 结果累积错误:最内层循环的
ct变量每次迭代都会被覆盖,最终sum(ct)只会拿到最后一次迭代的数值,无法累加所有符合条件的贴现成本 - 空值场景报错风险:如果当前批次没有符合「报告时间>=10.25」的样本,
index长度为0时最内层循环不执行,ct对象不存在,sum(ct)会触发新报错
修复后可直接运行的代码
# 预设固定参数 set.seed(124) data.nbin <- rnbinom(n=10, size=6.230651, mu=77.896194) prob = 6.23065/(6.23065+77.896194) T_THRESHOLD = 10.25 # 用固定常量名避免变量被循环重新赋值覆盖 # 提前初始化结果存储向量,从根源解决「对象未找到」的报错 y <- numeric(length(data.nbin)) s <- numeric(length(data.nbin)) for (i in 1:length(data.nbin)) { n_event <- data.nbin[i] y[i] <- n_event # 生成对应数量的事件发生时间、报告时间 time.happen <- runif(n_event, min=0, max=T_THRESHOLD) time.report <- rexp(n_event, rate=0.2587) # 筛选「报告时间超过截止阈值」的样本索引 index <- which(time.report >= T_THRESHOLD) # 处理无符合样本的场景,避免空值报错 if (length(index) == 0) { s[i] <- 0 next } # 用向量化计算替代逐层循环累加,避免结果被覆盖 u_vec <- time.report[index] - T_THRESHOLD c_vec <- rlnorm(n = length(index), meanlog = 14.4257740, sdlog = 0.7897719) ct_vec <- (1 + 0.05)^u_vec * c_vec # 计算当前批次的总贴现成本存入s向量 s[i] <- sum(ct_vec) } # 输出最终生成的s向量 s
上述代码在解决原有报错的基础上,用向量化操作替代了冗余的逐层循环,同时修复了变量覆盖、结果累加错误、空场景报错等逻辑问题,运行后可直接输出完整的s向量。
内容的提问来源于stack exchange,提问作者Jasmine Helen
相关产品推荐
相关产品推荐

