क्या किसी के पास आर में अपवाद से निपटने के उदाहरण / ट्यूटोरियल हैं? आधिकारिक दस्तावेज बहुत ही महत्वपूर्ण है।
क्या किसी के पास आर में अपवाद से निपटने के उदाहरण / ट्यूटोरियल हैं? आधिकारिक दस्तावेज बहुत ही महत्वपूर्ण है।
जवाबों:
शेन के जवाब के अलावा अन्य स्टैकऑवरफ्लो चर्चाओं की ओर इशारा करते हुए, आप एक कोड खोज सुविधा की कोशिश कर सकते हैं। Google के कोड खोज को इंगित किया गया यह मूल उत्तर तब से बंद है, लेकिन आप कोशिश कर सकते हैं
सिर्फ रिकॉर्ड के लिए, वहाँ भी है try
लेकिन tryCatch
बेहतर हो सकता है। मैंने Google कोड खोज में एक त्वरित गणना की कोशिश की, लेकिन इस क्रिया के लिए बहुत अधिक झूठी सकारात्मकताएं प्राप्त की हैं - फिर भी ऐसा लगता है 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"))
इन संबंधित सवालों पर एक नजर:
संबंधित Google खोज के इस परिणाम से मुझे मदद मिली: 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
को उस तरीके को नियंत्रित करने की अनुमति मिलती है जिसमें त्रुटि 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)
}
अंत में, एक उच्च स्तरीय प्रोग्रामर का उपयोग करता है 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
) में छोड़ दिया गया है ।
रिस्टार्ट फंक्शन Lisp से विरासत में मिले R में बहुत महत्वपूर्ण है। यह उपयोगी है यदि आप लूप बॉडी में कुछ फ़ंक्शन को कॉल करना चाहते हैं और आप केवल प्रोग्राम को जारी रखना चाहते हैं यदि फ़ंक्शन कॉल गिर जाता है। इस कोड को आज़माएं:
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(){})