R'de istisna işleme örnekleri / öğreticileri olan var mı? Resmi belgeler çok kısa.
R'de istisna işleme örnekleri / öğreticileri olan var mı? Resmi belgeler çok kısa.
Yanıtlar:
Shane'in sizi diğer StackOverflow tartışmalarına yönlendiren cevabının yanı sıra, bir kod arama özelliğini deneyebilirsiniz. Google'ın Kod Arama'ya işaret eden bu orijinal cevap, o zamandan beri kullanımdan kaldırıldı, ancak deneyebilirsiniz
Sadece kayıt için, ayrıca var try
ama tryCatch
tercih edilebilir. Google Code Search'te hızlı bir sayım denedim ama try fiilin kendisi için çok fazla yanlış pozitif alıyor - yine de tryCatch
daha yaygın olarak kullanılıyor.
Temel olarak tryCatch()
işlevi kullanmak istiyorsunuz . Daha fazla ayrıntı için yardıma ("tryCatch") bakın.
İşte önemsiz bir örnek (bir hata ile istediğinizi yapabileceğinizi unutmayın):
vari <- 1
tryCatch(print("passes"), error = function(e) print(vari), finally=print("finished"))
tryCatch(stop("fails"), error = function(e) print(vari), finally=print("finished"))
Aşağıdaki ilgili sorulara bir göz atın:
İlgili bir Google aramasından elde edilen bu sonuç bana yardımcı oldu: http://biocodenv.com/wordpress/?p=15 .
for(i in 1:16){
result <- try(nonlinear_modeling(i));
if(class(result) == "try-error") next;
}
İşlev trycatch()
oldukça basit ve bununla ilgili çok sayıda iyi öğretici var. R'deki hata işlemenin mükemmel bir açıklaması, Hadley Wickham'ın Advanced-R kitabında bulunabilir ve aşağıdaki, olabildiğince az kelimeyle ve çok temel bir giriştir :withCallingHandlers()
withRestarts()
Düşük seviyeli bir programcının mutlak değeri hesaplamak için bir fonksiyon yazdığını varsayalım. Bunu nasıl hesaplayacağından emin değil ama bir hatayı nasıl inşa edeceğini biliyor ve saflığını özenle aktarıyor:
low_level_ABS <- function(x){
if(x<0){
#construct an error
negative_value_error <- structure(
# with class `negative_value`
class = c("negative_value","error", "condition"),
list(message = "Not Sure what to with a negative value",
call = sys.call(),
# and include the offending parameter in the error object
x=x))
# raise the error
stop(negative_value_error)
}
cat("Returning from low_level_ABS()\n")
return(x)
}
Orta düzey bir programcı ayrıca mutlak değeri hesaplamak için bir işlev yazar ve maalesef eksik olanı kullanır. low_level_ABS
işlevi kullanır. Düşük seviyeli kodun negative_value
, değeri x
negatif olduğunda bir hata attığını bilir ve kullanıcıların bir hatadan kurtulma (veya yapmama) yolunu kontrol etmelerine izin veren bir kurarak soruna bir çözüm önerir .restart
mid_level_ABS
mid_level_ABS
negative_value
mid_level_ABS <- function(y){
abs_y <- withRestarts(low_level_ABS(y),
# establish a restart called 'negative_value'
# which returns the negative of it's argument
negative_value_restart=function(z){-z})
cat("Returning from mid_level_ABS()\n")
return(abs_y)
}
Son olarak, yüksek seviyeli bir programcı mid_level_ABS
, mutlak değeri hesaplamak için işlevi kullanır ve yeniden başlatma işleyicisini kullanarak mid_level_ABS
bir negative_value
hatadan kurtarılmasını söyleyen bir koşul işleyici oluşturur
.
high_level_ABS <- function(z){
abs_z <- withCallingHandlers(
# call this function
mid_level_ABS(z) ,
# and if an `error` occurres
error = function(err){
# and the `error` is a `negative_value` error
if(inherits(err,"negative_value")){
# invoke the restart called 'negative_value_restart'
invokeRestart('negative_value_restart',
# and invoke it with this parameter
err$x)
}else{
# otherwise re-raise the error
stop(err)
}
})
cat("Returning from high_level_ABS()\n")
return(abs_z)
}
Tüm bunların amacı, withRestarts()
ve withCallingHandlers()
fonksiyon
high_level_ABS
söylemek mümkün oldu mid_level_ABS
tarafından gündeme hatalardan kurtarmak için nasıl low_level_ABS
yürütülmesini durmadan hata
mid_level_ABS
sizinle yapamaz şeydir, tryCatch()
:
> high_level_ABS(3)
Returning from low_level_ABS()
Returning from mid_level_ABS()
Returning from high_level_ABS()
[1] 3
> high_level_ABS(-3)
Returning from mid_level_ABS()
Returning from high_level_ABS()
[1] 3
Uygulamada, doğru hata işleme yönteminin duruma göre değişebileceği ve belirli hataların nasıl ele alınacağına ilişkin seçimin üst düzey işlevlere bırakıldığı çok sayıda (belki milyonlarca kez) low_level_ABS
bir işlevi temsil eder .mid_level_ABS
high_level_ABS
Yeniden başlatma işlevi Lisp'ten miras alınan R'de çok önemlidir. Döngü gövdesinde bir işlev çağırmak ve işlev çağrısı çöktüğünde programın devam etmesini istiyorsanız yararlıdır. Bu kodu deneyin:
for (i in 1:20) withRestarts(tryCatch(
if((a <- runif(1))>0.5) print(a) else stop(a),
finally = print("loop body finished!")),
abort = function(){})