如何避免uniroot报错终止循环,出错时填充NA继续执行?
解决方案
核心实现逻辑是通过R语言内置的tryCatch()函数捕获uniroot运行时抛出的错误,错误触发时直接返回NA赋值给对应位置,不会中断整个循环的执行。
修改后的完整代码如下:
# 原函数定义保持不变 func <-function(f) -a*b/c*0.5*d*e^2 + (d/f-1)*g*sin(h*(pi/180))-i dat <- data.frame(a = c(0.99,0.99,0.99), b = c(0.1986572,0.1986572,0.1986572), c = c(237.5,237.5,237.5), d = c(1028.372, 1028.711, 1028.372), e = c(2.46261, 2.986461, 2.46261), f = c(-1,-1,-1), g = c(9.8,9.8,9.8), h = c(-54.97964, -51.65978, -54.97964), i = c(0.03699588, -0.0375189, 0.03699588)) # 修改循环部分,新增错误捕获逻辑 for(j in 1:nrow(dat)){ a <- dat$a[j] b <- dat$b[j] c <- dat$c[j] d <- dat$d[j] e <- dat$e[j] g <- dat$g[j] h <- dat$h[j] i <- dat$i[j] # 捕获uniroot运行错误 sol <- tryCatch( expr = { uniroot(func, c(0, 2000), extendInt = "yes")$root }, error = function(e){ # 报错时返回NA return(NA) } ) dat$f[j] <- sol print(j) }
运行完成后dat$f的输出结果为:
[1] 1526.566 NA 1526.566
完全符合需求。如果需要定位具体错误原因,可以在error回调函数中增加打印逻辑输出报错信息。
内容的提问来源于stack exchange,提问作者imtaiky
相关产品推荐
相关产品推荐

