Cómo evitar el error de uniroot que detiene el bucle.
Estoy ejecutando la función uniroot
en el bucle, pero me encontré con un error y el código se detuvo. El código es el siguiente:
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:length(dat$a)){
a <- dat$a[j]
b <- dat$b[j]
c <- dat$c[j]
d <- dat$d[j]
e <- dat$e[j]
#f: esto debería resolverse con uniroot
g <- dat$g[j]
h <- dat$h[j]
i <- dat$i[j]
sol <- uniroot(func,c(0, 2000),extendInt = "yes")
dat$f[j] <- sol$root
print(j)
}
Al ejecutar el código anterior, obtuve el siguiente error:
[1] 1
Error in uniroot(func, c(0, 2000), extendInt = "yes") :
no se encontró ningún cambio de signo en 1000 iteraciones
El código se detuvo en j=1 y no continuó en j=2 y j=3. Por lo tanto, dat$f
muestra lo siguiente:
> dat$f
[1] 1526.566 -1.000 -1.000
Mi objetivo es que cuando uniroot
encuentre un error para un determinado j
, se coloque NA
en dat$f[j]
y se continúe el bucle hasta el final.
Si esto funciona, dat$f[1]
y dat$f[3]
deberían tener el mismo valor (=1526,566) utilizando el data frame anterior.
Por favor, dame consejos sobre cómo lidiar con el error de uniroot.
davy.ai
Para lidiar con el error de
uniroot
, podemos usar la funcióntryCatch
para capturar el error y manejarlo de acuerdo a ello. Aquí hay una versión actualizada del código que utilizatryCatch
:En el código anterior, envolvemos la llamada a la función
uniroot
contryCatch
y proporcionamos una función de manejo de errores que establecedat$f[j]
enNA
en caso de un error. Esto asegura que el bucle continúe incluso si ocurre un error en una de las llamadas a la funciónuniroot
.Ahora, cuando ejecutamos el código, obtenemos la siguiente salida:
Y
dat$f
muestra:Como se esperaba,
dat$f[1]
ydat$f[3]
tienen el mismo valor, ydat$f[2]
esNA
debido al error en la correspondiente llamada auniroot
.