首页 文章

在循环中略过偶然的错误

提问于
浏览
3

我知道"skip error in for loop"已被多次回答(参见How to skip an error in a loopSkip Error and Continue Function in R) . 但是所有答案都很复杂,很难适用于新手的不同情况 .

我正在使用一段代码对100个数据集进行高斯直方图拟合 .

results = list()
for(i in 1:length(T_files)){
  R = Table[i][,1]
  tab = data.frame(x = seq_along(R), r = R)
  res = nls(R ~ k*exp(-1/2*(x-mu)^2/sigma^2), start=c(mu=15,sigma=5, k=1) , data = tab)
  v = summary(res)$parameters[,"Estimate"]
  fun = function(x) v[3]*exp(-1/2*(x-v[1])^2/v[2]^2) 
  results[[i]] = fun(seq(0, 308, 1))/max(fun_SP(seq(0, 308, 1)))/2
}

在对每个人进行测试时,代码适用于大多数数据集 . 但是,循环不会显示“nls(...)中的错误:奇异梯度”消息 . 我想跳过此消息并继续下一个数据集 .

我知道可以使用 tryCatch 函数,但包含 nls 函数的行很复杂,我还没有找到在这一行中正确使用tryCatch的方法 . 欢迎任何建议:-)

1 回答

  • 2

    使用函数 try ,它允许您保存错误,然后将条件 if(error==T) 然后"pass to next df" . 像这样的东西:

    error<-try(your code...)
    if(class(error)!="try-error"){pass to the next one}
    

    在你的情况下,也许必须是:

    results = list()
    for(i in 1:length(T_files)){
      R = Table[i][,1]
      tab = data.frame(x = seq_along(R), r = R)
      error = try(res <- nls(R ~ k*exp(-1/2*(x-mu)^2/sigma^2), start=c(mu=15,sigma=5, k=1) , data = tab))
    
        if(class(error)!="try-error"){
          v = summary(res)$parameters[,"Estimate"]
          fun = function(x) v[3]*exp(-1/2*(x-v[1])^2/v[2]^2) 
          results[[i]] = fun(seq(0, 308, 1))/max(fun_SP(seq(0, 308, 1)))/2
        }else{
          pass to next data frame (or something like that)
             }
    }
    

相关问题