R语言WHILE循环多条件正确设置及空列表问题修复
代码错误原因
你的代码存在两个核心问题,导致循环无法正常运行:
- 缺失必要变量初始化:
for循环内的初始赋值步骤没有定义nrow_i,第一次执行while条件判断时,R无法找到该对象会直接报错中断,循环逻辑完全不执行,最终只返回最开始定义的空列表。哪怕全局环境之前存在同名的nrow_i对象,跨迭代复用变量值也会导致判断逻辑完全失控,结果不可信。 - 逻辑运算符使用错误:
while循环仅当括号内条件返回TRUE时才会重复执行内部代码。你使用了&&(逻辑与),意味着必须同时满足「三个样本的Sepal.Length均值和小于15」和「重复行数为0」才会继续抽样,和你预期的“两个终止条件同时达标才停止抽样”的逻辑完全相反。
修正方案
- 在
for循环初始化阶段给所有while判断用到的变量赋值,给nrow_i设非0初始值保证循环可以正常启动 - 调整
while的判断逻辑:只要「均值和小于15」或者「样本存在重复行」任意一个条件成立,就继续重抽,直到两个条件都不满足(即均值和≥15、无重复行)时停止循环,运算符换为||(逻辑或)
修正后的可运行代码:
library(dplyr) list_results <- list() for (i in 1:100){ # 初始化所有循环判断用到的变量 c1_i = c2_i = c3_i = ctotal_i = 0 nrow_i = 1 # 初始设为非0值,保证首次判断时循环条件成立 # 任意一个终止条件未达成就继续抽样 while( (c1_i + c2_i + c3_i < 15) || (nrow_i != 0) ) { num_1_i = sample_n(iris, 30) num_2_i = sample_n(iris, 30) num_3_i = sample_n(iris, 30) c1_i = mean(num_1_i$Sepal.Length) c2_i = mean(num_2_i$Sepal.Length) c3_i = mean(num_3_i$Sepal.Length) ctotal_i = c1_i + c2_i + c3_i combined_i = rbind(num_1_i, num_2_i, num_3_i) nrow_i = nrow(unique(combined_i[duplicated(combined_i), ])) } inter_results_i <- data.frame(i, c1_i, c2_i, c3_i, ctotal_i, nrow_i) list_results[[i]] <- inter_results_i }
逻辑调整说明
如果你需要的终止规则不同,可以对应调整判断逻辑:
- 要求两个终止条件同时满足才停循环:
while用||连接两个“未达标”的判断项 - 要求两个终止条件满足任意一个就停循环:
while用&&连接两个“未达标”的判断项
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

