如何在R语言中正确存储while循环的迭代结果?
问题描述
我有三个向量:
N <- c(213,214,215,216) R <- c(0.11937253,0.11937253, 0.11937253,0.11937253) P <- c(0.549252447, 0.549252447, 0.549252447, 0.549252447)
我尝试用带嵌套while循环的自定义函数获取结果:
tmp <- function(N,R,P) { err <- c() i = 2 while ((N[i-1]+R[i-1]+P[i-1]) < 220) { if (is.na(N[i])) { break { } else { err <- N[i]/(R[i]+P[i]) i = i + 1 print(err) } }
现在遇到的问题是:用print能看到完整的结果向量,但用return时R只返回迭代的第一个元素。我需要得到包含所有迭代元素的向量,该怎么处理?
注:无需关注循环条件(仅作占位用,实际条件已验证无问题);添加if语句是为避免无限循环。
解决方案
问题核心是每次循环时你直接覆盖了err变量,而不是把新结果追加到向量里,同时原函数存在语法错误,修改方式如下:
- 将赋值语句从
err <- N[i]/(R[i]+P[i])改为err <- c(err, N[i]/(R[i]+P[i])),每次迭代把新计算的元素添加到err向量末尾,而非替换原有内容。 - 修复语法错误:
break后不需要大括号,补全函数和while循环的闭合括号。 - 在函数末尾添加
return(err),确保返回完整的err向量。
修改后的完整函数:
tmp <- function(N,R,P) { err <- c() i <- 2 while ((N[i-1]+R[i-1]+P[i-1]) < 220) { if (is.na(N[i])) { break } else { # 追加新元素到err向量 err <- c(err, N[i]/(R[i]+P[i])) i <- i + 1 } } # 返回完整的err向量 return(err) }
调用测试:
tmp(N, R, P) # 输出结果: # [1] 334.0000 335.5846 337.1692
这样就能得到包含所有迭代元素的向量了。
内容的提问来源于stack exchange,提问作者fredi96
相关产品推荐
相关产品推荐

