আর-এ ব্যতিক্রম হ্যান্ডলিং [বন্ধ]


97

আর-এ ব্যতিক্রম হ্যান্ডলিংয়ের উদাহরণ / টিউটোরিয়াল রয়েছে কি? অফিসিয়াল ডকুমেন্টেশন খুব সংক্ষিপ্ত।


4
এটি একটি ভাল উদাহরণ: stackoverflow.com/q/12193779/2026975

আমি এই ব্লগ পোস্টটি বেশ কার্যকর বলে খুঁজে পেয়েছি: http://mamamascience.com/WorkingWithData/?p=912
paul_dg

উত্তর:


31

শেনের উত্তর আপনাকে অন্যান্য স্ট্যাকওভারফ্লো আলোচনার দিকে ইঙ্গিত করার পাশাপাশি আপনি একটি কোড অনুসন্ধান বৈশিষ্ট্য ব্যবহার করতে পারেন। গুগলের কোড অনুসন্ধানের প্রতি ইঙ্গিত করা এই মূল উত্তরটি তখন থেকে বন্ধ করা হয়েছে, তবে আপনি চেষ্টা করতে পারেন

শুধু রেকর্ডের জন্য, সেখানে হয় tryকিন্তু tryCatchবাঞ্ছনীয় হতে পারে। আমি গুগল কোড অনুসন্ধানে একটি দ্রুত গণনা চেষ্টা করেছি কিন্তু ক্রিয়াটির জন্য নিজেই অনেকগুলি মিথ্যা ধনাত্মকতা পেয়েছি - তবুও এটি tryCatchআরও বেশি ব্যবহৃত হয় বলে মনে হয়।


হতে পারে এই উদাহরণটি সাহায্য করতে পারে: http://stackoverflow.com/a/12195574/2026975
14 ইআরআইআরসকে

একটি গিথুব অনুসন্ধান সম্ভবত অবনমিত লিঙ্কটির জন্য একটি শালীন প্রতিস্থাপন।
গ্রেগর থমাস

সমস্ত লিঙ্ক ভেঙে গেছে।
Toros91

60

মূলত আপনি tryCatch()ফাংশনটি ব্যবহার করতে চান । আরও তথ্যের জন্য সহায়তা ("ট্রাইচ্যাচ") দেখুন।

এখানে একটি তুচ্ছ উদাহরণ (মনে রাখবেন যে কোনও ত্রুটি দিয়ে আপনি যা করতে পারেন তা করতে পারেন):

vari <- 1
tryCatch(print("passes"), error = function(e) print(vari), finally=print("finished")) 
tryCatch(stop("fails"), error = function(e) print(vari), finally=print("finished")) 

এই সম্পর্কিত প্রশ্নগুলি একবার দেখুন:


22

সম্পর্কিত গুগল অনুসন্ধানের এই ফলাফলটি আমাকে সহায়তা করেছে: http://biocodenv.com/wordpress/?p=15

for(i in 1:16){
result <- try(nonlinear_modeling(i));
if(class(result) == "try-error") next;
}

8

ফাংশনটি trycatch()মোটামুটি সোজা এগিয়ে রয়েছে এবং এর উপর প্রচুর ভাল টিউটোরিয়াল রয়েছে। আর-তে ত্রুটি পরিচালনার একটি দুর্দান্ত ব্যাখ্যা হ্যাডলি উইকহ্যামের বই অ্যাডভান্সড-আর-এ পাওয়া যাবে এবং এরপরে যা ঘটেছিল তা একটি খুব মৌলিক পরিচয় withCallingHandlers()এবংwithRestarts() যতটা সম্ভব অল্প কথায় হিসাবে:

আসুন বলি যে কোনও নিম্ন স্তরের প্রোগ্রামার পরম মান গণনা করার জন্য একটি ফাংশন লিখেন। কীভাবে এটি গণনা করা যায় সে সম্পর্কে তিনি নিশ্চিত নন, তবে কীভাবে ত্রুটি তৈরি করবেন এবং অযত্নে তাঁর উদ্বেগকে জানান:

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)
}

একটি মাঝারি স্তরের প্রোগ্রামারও চূড়ান্তভাবে অসম্পূর্ণ low_level_ABSফাংশনটি ব্যবহার করে নিখুঁত মান গণনা করার জন্য একটি ফাংশন লিখে । তিনি জানেন যে নিম্ন স্তরের কোডটি negative_value ত্রুটি ছুঁড়ে দেয় যখন মানটি xনেতিবাচক হয় এবং সমস্যার সমাধানের পরামর্শ দেয় , restartযা ব্যবহারকারীদের ত্রুটি থেকে পুনরুদ্ধার (বা না করে) mid_level_ABSনিয়ন্ত্রণ করতে পারে allowsmid_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)
}

অবশেষে, একটি উচ্চ স্তরের প্রোগ্রামার mid_level_ABSপরম মান গণনা করতে ফাংশনটি ব্যবহার করে এবং একটি শর্ত হ্যান্ডলার স্থাপন করে যা পুনরায় চালু হ্যান্ডলারটি ব্যবহার করে ত্রুটি mid_level_ABSথেকে পুনরুদ্ধার করতে বলে negative_value

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)
}

এই সমস্ত বিষয় হ'ল ব্যবহার করে withRestarts()এবং withCallingHandlers(), ফাংশনটি এটি কার্যকর করতে বাধা না দিয়ে ত্রুটি দ্বারা উত্থাপিত ত্রুটিগুলি থেকে কীভাবে পুনরুদ্ধার high_level_ABSকরতে পারে তা বলতে সক্ষম হয়েছিল , যা এমন কিছু যা আপনি করতে পারবেন না :mid_level_ABSlow_level_ABSmid_level_ABStryCatch()

> 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

অনুশীলনে, low_level_ABSএমন একটি ফাংশন প্রতিনিধিত্ব করে যা mid_level_ABSপ্রচুর পরিমাণে কল করে (সম্ভবত কয়েক মিলিয়ন বারও), যার জন্য ত্রুটি পরিচালনার সঠিক পদ্ধতিটি পরিস্থিতি অনুসারে পরিবর্তিত হতে পারে এবং নির্দিষ্ট ত্রুটিগুলি কীভাবে পরিচালনা করতে হয় তার পছন্দটি উচ্চ স্তরের ফাংশনগুলিতে ছেড়ে যায় ( high_level_ABS)।


7

রিসার্ট ফাংশনটি লিস্পের উত্তরাধিকার সূত্রে খুব গুরুত্বপূর্ণ। লুপের বডিটিতে কিছু ফাংশন কল করতে চাইলে এটি কার্যকর এবং আপনি যদি ফাংশন কলটি ধসে পড়ে তবে প্রোগ্রামটি চালিয়ে যেতে চান। এই কোড ব্যবহার করে দেখুন:

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(){})
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.