आर में "फेंक" के बराबर


140

आर में एक त्रुटि "कैसे" फेंकती है? मेरे पास एक फ़ंक्शन है जो डेटा फ़्रेम और कुछ कॉलम नाम लेता है और उनके साथ सामान करता है। यदि कॉलम मौजूद नहीं है, तो मैं चाहता हूं कि फ़ंक्शन बंद हो जाए और इसके आधार पर सभी फ़ंक्शन रोकें।

मैं पर ध्यान दिया है recoverऔर browseऔर tracebackलेकिन, ठीक है, वे पास नहीं बल्कि मैं के लिए क्या देख रहा हूँ लग रहा था।


2
राइट, रिकवरी, ब्राउज़र और ट्रेसबैक डिबगिंग के लिए हैं, जबकि कोशिश / कैच सिस्टम उत्पादन कोड में त्रुटियों को संभालने के लिए हैं।
हरलान

20
मुझे यह पसंद है जब प्रश्न पूछने वाले उस फ़ंक्शन के नाम का उपयोग करते हैं जो वे एक प्रश्न में कई बार देख रहे हैं;)
हैडली

मुझे लगता है कि एक कारण है कि इस सवाल में शीर्ष उत्तर की तुलना में अधिक उत्थान है। भले ही यह अन्य प्रश्न तकनीकी रूप से ऑफ-टॉपिक हो, लेकिन यह अपरिचित विषय का उत्कृष्ट तंग सारांश है जो स्टैक ओवरफ्लो के लिए प्रसिद्ध है।
जोशिया योदर

जवाबों:


113

देखें help(tryCatch):

स्थितियां ' signalCondition' द्वारा संकेतित हैं । इसके अतिरिक्त,
' stop' और ' warning' कार्यों को भी
दलील को स्वीकार करने के लिए संशोधित किया गया है।

और बाद में 'See Also' के तहत:

' stop' और ' warning' सिग्नल की स्थिति, और ' try' अनिवार्य रूप से ' tryCatch' का सरलीकृत संस्करण है ।

तो आप शायद चाहते हैं stop


24
यह पूरी तरह से काम करता है। आर बहुत अजीब है, अपनी खुद की कोई गलती के माध्यम से - यह बहुत पहले डिजाइन किया गया था जब तक कि हम अच्छी व्याख्या की गई भाषा डिजाइन को इस्त्री नहीं करते।
forkandwait

5
लेखकों के अनुसार, यह योजना से काफी प्रभावित था, जो पुराना और अच्छा दोनों है। R 'lispy' है, लेकिन कायरता डेटा संरचनाओं के साथ। आर में "दिलचस्प" भाग संभवतः से संबंधित है कि बहुत सी परंपराएं अन्य भाषाओं से भिन्न होती हैं, विशेष रूप से सी-भाषा परिवार कि यह वाक्यगत रूप से भी करीब है। मैं अनुमान लगाऊंगा क्योंकि भाषा का विकास सांख्यिकीविदों के एक समूह द्वारा किया गया था, जिन्हें एक अच्छे उपकरण की आवश्यकता थी, बजाय डेवलपर्स को एक अच्छे उपकरण की आवश्यकता के। इस तथ्य को कि 'डॉट' सिर्फ एक चरित्र है, जिसे लेने में काफी समय लगा।
कार्ल

5
यहां कुछ बुनियादी उदाहरण महान होंगे, न केवल उद्धरण। यहाँ stackoverflow.com/a/23917007/54964
Léo Léopold Hertz at

मैं इस सवाल पर आया जब खोज करना कि कैसे एक त्रुटि त्रुटि संदेश के साथ आर में एक त्रुटि को पुनर्जीवित करना है, लेकिन ट्रेस को बरकरार रखते हुए (जैसा कि, आप traceback()त्रुटि के बाद निष्पादित करते हैं कि क्या गलत हुआ)। ट्रेस के तर्क stopमें प्रयोग करना ट्रेस को गड़बड़ कर देगा। हालांकि, तर्क एक अतिरिक्त संदेश फेंकने और ट्रेस को उपयोगी रखने की अनुमति देगा। बिल्कुल ऑन-टॉपिक नहीं, लेकिन, मुझे लगता है, कुछ मिनिट्स को वारंट करने के लिए काफी महत्वपूर्ण है और मॉडरेशन के खतरे ने इस टिप्पणी को खिड़की से बाहर कर दिया। :-)errortryCatchfinally
माली रिमार्कर


8

डिर्क के आधार कार्यों से परे:

R.oo पैकेज थ्रो () फ़ंक्शन जो बहुत उपयोगी है सहित अतिरिक्त अपवाद हैंडलिंग कार्यक्षमता, है। आप सामान्य प्रयास या trycatch फ़ंक्शन के अपवादों को पकड़ सकते हैं:

> try(throw("Division by zero.")); print("It's ok!");
Error: [2009-10-22 10:24:07] Exception: Division by zero.
[1] "It's ok!"

आप इसके बारे में और अधिक यहाँ पढ़ सकते हैं: http://www1.maths.lth.se/help/R/R.oo/


8
हेहे। OO के बिना पर्याप्त कायरता नहीं है? फ्लिप करने के लिए क्षमा करें, और निश्चित रूप से दिलचस्प उत्तर के लिए धन्यवाद, लेकिन मैं सादे पुराने पड़ाव () के साथ जाऊंगा।
फोर्कवंड

1
अब और भी अधिक OO है। :)
Iterator

3
@ws। आर के बारे में इतना मजेदार क्या है? plotएक फ़ंक्शन प्लॉट करता है, try stop warnजैसा कि आप अपेक्षा करते हैं , सभी काम करते हैं, और लगभग सब कुछ जो मैं करना चाहता हूं वह एक-लाइनर है।
isomorphismes

4
अक्सर "वन-लाइनर्स की शक्ति" एक भाषा के लिए एक अच्छा मीट्रिक नहीं है। हम में से कई के लिए पठनीय, समझने योग्य कोड कम लाइनों को ट्रम्प करता है। वास्तव में, मेरे लिए बहुत कुछ अनुचित नहीं है क्योंकि मैं एक शुरुआती हूं, और मैं तदनुसार अपेक्षाओं को जांचने की कोशिश करता हूं। लेकिन अन्य भाषाओं को सामान होने के लिए 0 से जाना काफी सहज बना देता है। लगता है कि एक-लाइनर्स को पढ़ने में मुश्किल चालाक की संस्कृति विकसित हुई है। मैं अधिकतम अंग्रेजी जैसे कोड की संस्कृति के लिए तर्क दूंगा, जो अक्सर रूबी की तरह एक-लाइनर भी हो सकता है।
फिलिप

6

वास्तव में फ़ंक्शन stopifnotआपके कोड में स्वच्छता जांच को लागू करने के लिए बहुत सुविधाजनक है। यह कई तार्किक अभिव्यक्तियों में लेता है और यदि उनमें से कोई भी गलत का मूल्यांकन करता है तो एक त्रुटि देता है।

उदाहरण: यह जाँचने के लिए कि क्या डेटाफ़्रेम 'df' में कॉलम 'c' मौजूद है:

df <- data.frame(a = numeric(), b = numeric())
stopifnot(!is.null(df$c))

यह निम्न त्रुटि देगा:

Error: !is.null(df$c) is not TRUE

अजगर की तरह लगता है assert(...)...
योशिय्याह योद

1

आप जाँच सकते हैं कि क्या कॉलम मौजूद है और आप जो चाहें कर सकते हैं।
मान लें कि कोई data.frameनाम df1और जाँच रहा है कि क्या स्तंभ col1मौजूद है:

if(! any(grepl('^col1$',colnames(df1)))) stop("nonexistent column")

या

if(! any(grepl('^col1$',colnames(df1)))) return(-1)

उदाहरण के लिए

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.