【问题标题】:Skip occasional error in loop跳过循环中的偶尔错误
【发布时间】:2018-04-14 23:04:46
【问题描述】:

我知道“for 循环中的跳过错误”已被多次回答(请参阅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 的方法。欢迎任何建议:-)

【问题讨论】:

  • 我会尝试在 nls 调用上使用 tryCatch。所以将res = nls(R ~ k*exp(-1/2*(x-mu)^2/sigma^2), start=c(mu=15,sigma=5, k=1) , data = tab) 替换为tryCatch(res = nls(R ~ k*exp(-1/2*(x-mu)^2/sigma^2), start=c(mu=15,sigma=5, k=1) , data = tab), next)。我不知道这是否可行,因为我以前没有使用过 tryCatch,但值得一试

标签: r for-loop try-catch


【解决方案1】:

使用函数try,它可以让你保存错误,然后输入条件if(error==T),然后“传递到下一个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)
         }
}

【讨论】:

  • 感谢您分享这个想法。 {try} 中的函数成为未使用的参数
  • 尝试错误(res = nls(R ~ k * exp(-1/2 * (x - mu)^2/sigma^2), start = c(mu = 15, : 未使用)参数 (res = nls(R ~ k * exp(-1/2 * (x - mu)^2/sigma^2), start = c(mu = 15, sigma = 5, k = 1), data = tab ))
  • 我知道会发生什么,你必须在函数内部使用&lt;- 而不是=,因为它们把它当作函数的参数。我编辑了答案。
  • 请@Gabriel123,如果答案是好的,请给它好。这对我有很大帮助。
  • 抱歉,我一遍又一遍地尝试。不,我担心这个问题没有得到解决。我一定是输入错误了 - 我只是通过... }else{ next } 来总结您的代码,希望这有意义
猜你喜欢
  • 2013-01-22
  • 1970-01-01
  • 2012-12-13
  • 1970-01-01
  • 2012-05-09
  • 2015-02-07
  • 2023-03-08
  • 2014-08-29
  • 2018-01-25
相关资源
最近更新 更多