如何编写循环逻辑:当runModels返回警告时重复执行Mplus代码段
解决方案
要实现「当runModels(filenames)返回警告时,重复执行原代码第1-11行,直至无警告」的需求,可以通过while循环结合警告捕获机制实现。以下是修改后的完整代码:
# 初始化循环标记:默认需要继续尝试 has_warning <- TRUE while (has_warning) { # 原代码第1-11行:生成并编辑Mplus输入文件 aMNLFA.sample(ob) aMNLFA.initial(ob) line <- "[IBR14$1-IBR14$8]; [IBR21$1-IBR21$8]; [IBR25$1-IBR25$4];" filenames = list("meanimpactscript.inp", "varimpactscript.inp", "measinvarscript_IBR14.inp", "measinvarscript_IBR21.inp", "measinvarscript_IBR25.inp") for (i in filenames) { txt <- readLines(i) ix <- grep("ETA BY IBR25", txt) p <- paste(append(txt, line, ix), collapse = "\n") writeLines(p, con=i) } # 运行模型并捕获警告 has_warning <- FALSE withCallingHandlers( expr = runModels(filenames), warning = function(w) { # 捕获到警告时,标记为需要继续循环 has_warning <<- TRUE # 抑制警告信息输出,避免冗余打印 invokeRestart("muffleWarning") } ) }
核心逻辑说明
while循环通过has_warning变量控制重复执行:初始为TRUE确保第一次运行,无警告时设为FALSE终止循环。withCallingHandlers专门捕获runModels执行时的警告,一旦触发警告就重置循环标记,触发下一轮的输入文件生成与模型运行。invokeRestart("muffleWarning")用于屏蔽警告信息的打印,避免每次循环都输出重复警告内容。
内容的提问来源于stack exchange,提问作者wooden05
相关产品推荐
相关产品推荐

