आर

2009-10-22 15 views
97

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

मैंने recover और browse और traceback पर देखा है, लेकिन, ठीक है, वे नज़दीक लग रहे थे लेकिन मैं जो खोज रहा हूं वह नहीं।

+2

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

+15

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

उत्तर

77

help(tryCatch) देखें:

Conditions are signaled by ' signalCondition '. In addition, the
' stop ' and ' warning ' functions have been modified to also accept
condition arguments.

और बाद के तहत 'भी देखें':

' stop ' and ' warning ' signal conditions, and ' try ' is essentially a simplified version of ' tryCatch '.

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

+17

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

+2

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

+1

यहां कुछ बुनियादी उदाहरण महान होंगे, न केवल उद्धरण होंगे। यहां http://stackoverflow.com/a/23917007/54964 –

8

आधार कार्य है कि एक प्रकार की कटार का उल्लेख है परे:

R.oo package अतिरिक्त अपवाद हैंडलिंग उसकी कार्यशैली में फेंक() फ़ंक्शन जो बहुत उपयोगी है सहित, है। आप हमेशा की तरह कोशिश या 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/

+7

हेहे। ओ ओओ के बिना पर्याप्त मज़ाकिया नहीं है? फ़्लिप होने के लिए खेद है, और दिलचस्प जवाब के लिए निश्चित रूप से धन्यवाद, लेकिन मैं ऊपर पुराने सादे स्टॉप() के साथ जाऊंगा। – forkandwait

+1

अब और भी ओओ है। :) – Iterator

+3

@ws। आर के बारे में इतना मज़ाकिया क्या है? 'प्लॉट 'एक फंक्शन प्लॉट करता है,' कोशिश करें '' रोकें 'चेतावनी दें जैसा कि आप उम्मीद करेंगे, और लगभग हर चीज जो मैं करना चाहता हूं वह एक लाइनर है। – isomorphismes

27

सरल उदाहरण:

f <- function(a, b){ 

    if (a == 0){ 
      stop("error message") 
    } 
} 
+0

यहां http://stackoverflow.com/a/23917007/54964। –

4

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

उदाहरण:

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

आप देख सकते हैं स्तंभ मौजूद है:

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

यह निम्न त्रुटि फेंक देगा: स्तंभ 'सी' dataframe 'df' में मौजूद रहने पर जाँच करने के लिए और जो भी आप चाहते हैं करो।
मान लीजिए कि एक data.framedf1 नामित और जाँच करता है, तो स्तंभ col1 मौजूद है:

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

या

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

उदाहरण