আর-এ ব্যতিক্রম হ্যান্ডলিংয়ের উদাহরণ / টিউটোরিয়াল রয়েছে কি? অফিসিয়াল ডকুমেন্টেশন খুব সংক্ষিপ্ত।
আর-এ ব্যতিক্রম হ্যান্ডলিংয়ের উদাহরণ / টিউটোরিয়াল রয়েছে কি? অফিসিয়াল ডকুমেন্টেশন খুব সংক্ষিপ্ত।
উত্তর:
শেনের উত্তর আপনাকে অন্যান্য স্ট্যাকওভারফ্লো আলোচনার দিকে ইঙ্গিত করার পাশাপাশি আপনি একটি কোড অনুসন্ধান বৈশিষ্ট্য ব্যবহার করতে পারেন। গুগলের কোড অনুসন্ধানের প্রতি ইঙ্গিত করা এই মূল উত্তরটি তখন থেকে বন্ধ করা হয়েছে, তবে আপনি চেষ্টা করতে পারেন
শুধু রেকর্ডের জন্য, সেখানে হয় try
কিন্তু tryCatch
বাঞ্ছনীয় হতে পারে। আমি গুগল কোড অনুসন্ধানে একটি দ্রুত গণনা চেষ্টা করেছি কিন্তু ক্রিয়াটির জন্য নিজেই অনেকগুলি মিথ্যা ধনাত্মকতা পেয়েছি - তবুও এটি tryCatch
আরও বেশি ব্যবহৃত হয় বলে মনে হয়।
মূলত আপনি 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"))
এই সম্পর্কিত প্রশ্নগুলি একবার দেখুন:
সম্পর্কিত গুগল অনুসন্ধানের এই ফলাফলটি আমাকে সহায়তা করেছে: http://biocodenv.com/wordpress/?p=15 ।
for(i in 1:16){
result <- try(nonlinear_modeling(i));
if(class(result) == "try-error") next;
}
ফাংশনটি 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_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)
}
অবশেষে, একটি উচ্চ স্তরের প্রোগ্রামার 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_ABS
low_level_ABS
mid_level_ABS
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
অনুশীলনে, low_level_ABS
এমন একটি ফাংশন প্রতিনিধিত্ব করে যা mid_level_ABS
প্রচুর পরিমাণে কল করে (সম্ভবত কয়েক মিলিয়ন বারও), যার জন্য ত্রুটি পরিচালনার সঠিক পদ্ধতিটি পরিস্থিতি অনুসারে পরিবর্তিত হতে পারে এবং নির্দিষ্ট ত্রুটিগুলি কীভাবে পরিচালনা করতে হয় তার পছন্দটি উচ্চ স্তরের ফাংশনগুলিতে ছেড়ে যায় ( high_level_ABS
)।
রিসার্ট ফাংশনটি লিস্পের উত্তরাধিকার সূত্রে খুব গুরুত্বপূর্ণ। লুপের বডিটিতে কিছু ফাংশন কল করতে চাইলে এটি কার্যকর এবং আপনি যদি ফাংশন কলটি ধসে পড়ে তবে প্রোগ্রামটি চালিয়ে যেতে চান। এই কোড ব্যবহার করে দেখুন:
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(){})