R'de istisna işleme [kapalı]


97

R'de istisna işleme örnekleri / öğreticileri olan var mı? Resmi belgeler çok kısa.


1
Bu da iyi bir örnek: stackoverflow.com/q/12193779/2026975 .
imriss

Bu blog gönderisini oldukça faydalı buldum: http://mazamascience.com/WorkingWithData/?p=912
paul_dg

Yanıtlar:


31

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 tryama tryCatchtercih 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 tryCatchdaha yaygın olarak kullanılıyor.


Belki bu örnek yardımcı olabilir: http://stackoverflow.com/a/12195574/2026975
imriss

Bir Github araması muhtemelen feshedilmiş bağlantının yerine geçer.
Gregor Thomas

Tüm bağlantılar koptu.
Toros91

60

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:



8

İş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 xnegatif 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 .restartmid_level_ABSmid_level_ABSnegative_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_ABSbir negative_valuehatadan 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_ABSsöylemek mümkün oldu mid_level_ABStarafından gündeme hatalardan kurtarmak için nasıl low_level_ABSyürütülmesini durmadan hata mid_level_ABSsizinle 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_ABSbir işlevi temsil eder .mid_level_ABShigh_level_ABS


7

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(){})
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.