R 跳过循环中的偶然错误

R 跳过循环中的偶然错误,r,for-loop,try-catch,R,For Loop,Try Catch,我知道“for循环中的跳过错误”已被回答多次(请参阅或)。但对于新手来说,所有的答案都很复杂,很难适用于不同的情况 我正在使用一段代码对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

我知道“for循环中的跳过错误”已被回答多次(请参阅或)。但对于新手来说,所有的答案都很复杂,很难适用于不同的情况

我正在使用一段代码对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的方法。欢迎任何建议:-)

使用函数
try
,它允许您保存一个错误,然后放置一个条件
,如果(错误==T)
则“传递到下一个df”。大概是这样的:

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

error我会尝试通过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,但值得一试谢谢你分享这个想法。{try}中的函数在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))我知道会发生什么,你必须使用
Please@Gabriel123,如果答案是好的,请给它一样好。这将帮助我很多。对不起,我尝试了一遍又一遍。不,我担心这个问题没有得到解决。我一定输入了错误-我总结你的代码只是…}否则{next},希望这是有意义的
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)
         }
}