R语言while循环配置:如何确保循环仅在双条件同时满足时退出
核心错误点
你的代码有两个直接导致逻辑不符合预期的问题:
- while循环的判定逻辑完全写反。你需要的是「两个终止条件同时满足才退出」,但原判定
c1_i + c2_i + c3_i < 15 && nrow_i > 5的含义是「必须同时满足总和小于15、重复行数大于5才继续循环」,只要任意一个条件不满足——比如总和先超过15,哪怕重复行数是19——循环都会直接终止,这就是你拿到的结果nrow_i始终不符合要求的核心原因。 - 循环启动前没有给
nrow_i赋初始值,第一次循环判定时要么直接报变量不存在的错误,要么会调用全局环境里残留的同名变量,导致第一次循环的进入逻辑完全不可控。
修正后可直接运行的代码
library(dplyr) list_results <- list() for (i in 1:100){ # 初始化所有循环内变量,nrow_i初始值设为大于5的数,保证第一次能正常进入循环 c1_i = c2_i = c3_i = ctotal_i = 0 nrow_i = 100 # 循环继续规则:只要总和没超过15,或者重复行数≥5,就持续采样不退出 while(ctotal_i <= 15 || nrow_i >= 5) { 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 }
逻辑说明
- 修正后的循环判定用
||(或)连接两个继续运行的条件,等价于!(ctotal_i > 15 && nrow_i <5),也就是只有当「总和>15」「重复行数<5」两个条件同时满足时,循环才会终止,完全匹配你设定的规则。 - 代码没有做任何采样效率优化,会一直随机抽样直到命中符合要求的结果,完全适配你不介意运行时长的需求。
- 所有循环内变量都在for循环迭代内初始化,不会受全局环境残留变量的干扰,每一轮for循环的运行逻辑完全独立。
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

