R语言编写向vector存值直到出现重复值的while循环问题咨询
R迭代循环代码问题修正
原代码存在的问题
- 初始向量
vec <- numeric(100)预填充了100个0,只要fun(x)返回0就会误判为已存在,且迭代次数超过100会触发下标越界错误 - 单次循环内两次调用
fun(x),不仅浪费算力,如果fun包含随机逻辑或副作用,会导致判断和存储的值不一致 - 判断逻辑只检查预分配的全量向量,会把未使用的默认0值纳入判断范围,逻辑错误
修正后代码
场景1:迭代次数较少(<1000次),直接用动态向量更简便
首先可以用一个简单的测试函数验证逻辑,你可以替换为自己的fun实现:
# 示例自定义函数,可替换为你的实际逻辑 fun <- function(x) { (x * 3) %% 7 }
循环实现代码:
x <- 1 # 初始入参 vec <- c() # 初始化为空向量 k <- 0 while(TRUE) { current_res <- fun(x) # 单次循环仅调用一次fun,避免重复计算 if (current_res %in% vec) { # 结果已存在则终止循环 break } # 结果不存在则存入向量 k <- k + 1 vec[k] <- current_res x <- current_res # 更新下一次调用的入参 }
场景2:迭代次数较多,预分配空间提升性能
如果迭代次数预估很高,预分配足够大的空间可以避免动态扩容的性能损耗:
x <- 1 max_iter <- 10000 # 自行预估最大迭代上限,设置略大于实际值即可 vec <- numeric(max_iter) k <- 0 while(TRUE) { current_res <- fun(x) # 仅判断已经存入的有效元素,排除预分配的默认0值干扰 if (current_res %in% vec[1:k]) { break } k <- k + 1 # 超出预分配上限抛出提醒,避免越界 if (k > max_iter) { stop("迭代次数超过预设上限,可调大max_iter参数") } vec[k] <- current_res x <- current_res } vec <- vec[1:k] # 截断未使用的预分配空间,得到最终结果
改动说明
- 单次循环仅调用一次
fun(x),保证判断和存储的数值完全一致,也节省算力 - 调整终止判断逻辑,仅核对已经存入的有效迭代值,不会被预分配的默认0值干扰
- 增加越界保护,避免迭代次数过多时的下标报错
- 最终输出的
vec为全部不重复的迭代结果,符合需求
内容的提问来源于stack exchange,提问作者Kevin
相关产品推荐
相关产品推荐

