You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言WHILE循环多条件正确设置及空列表问题修复

代码错误原因

你的代码存在两个核心问题,导致循环无法正常运行:

  • 缺失必要变量初始化:for循环内的初始赋值步骤没有定义nrow_i,第一次执行while条件判断时,R无法找到该对象会直接报错中断,循环逻辑完全不执行,最终只返回最开始定义的空列表。哪怕全局环境之前存在同名的nrow_i对象,跨迭代复用变量值也会导致判断逻辑完全失控,结果不可信。
  • 逻辑运算符使用错误:while循环仅当括号内条件返回TRUE时才会重复执行内部代码。你使用了&&(逻辑与),意味着必须同时满足「三个样本的Sepal.Length均值和小于15」和「重复行数为0」才会继续抽样,和你预期的“两个终止条件同时达标才停止抽样”的逻辑完全相反。
修正方案
  1. 在for循环初始化阶段给所有while判断用到的变量赋值,给nrow_i设非0初始值保证循环可以正常启动
  2. 调整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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 06:34:01