R语言 创建一个if语句/循环,根据某行代码是否生成警告消息来重新运行多行代码

bxjv4tth  于 2022-12-20  发布在  其他
关注(0)|答案(1)|浏览(179)

我有下面的代码块来生成、编辑和运行几个Mplus输入文件。如果runModels(filenames)在第13行返回一个错误,我想重新运行第1-11行(尽可能多的时间,因为它需要),直到runModels(filenames)不返回一个警告消息(我说的错误原来,我的意思是警告消息)。

pengsaosao

pengsaosao1#

使用tryCatch捕获错误

go <- T

while(go){
  test <- tryCatch({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)}
    
    runModels(filenames)
    }, warning= function(w) return("repeat"))
  
  if(typeof(test)!="character"){
    go <- F
  }else{
    if(test!="repeat"){
      go <- F
    }
  }
}

runModels(filenames)

可重现示例:

testfunc <- function(x){
  if(x!=10){
    warning("not 10")
  }
  return(x)
}

go <- T
count=0

while(go){
  test <- tryCatch({
  count=count+1
  testfunc(count)
  }, warning= function(w) return("repeat"))
  
  if(typeof(test)!="character"){
    go <- F
  }else{
    if(test!="repeat"){
      go <- F
    }
  }
}

> count
[1] 10
> test
[1] 10

相关问题