2012-11-19 10 views
12

कभी कभी आर मुझे इस तरह केएक आर त्रुटि हुई कहां से मिलें?

के रूप में

त्रुटि त्रुटियों फेंकता है तो (ncol (x) = 2!) {: तर्क लंबाई शून्य

की कोई अतिरिक्त जानकारी के साथ है जब मैं लिखा है ऐसा कोई कोड नहीं है। क्या यह पता लगाने का एक सामान्य तरीका है कि कौन सा फ़ंक्शन पैकेज में त्रुटि का कारण बनता है?

चूंकि अधिकांश पैकेज संपीड़ित होते हैं, यह /usr/lib/R/library grep के लिए तुच्छ नहीं है।

+0

मुझे डीबग करने का सबसे आसान तरीका लाइन लाइन कोड के माध्यम से कदम उठाना है। यदि आपकी त्रुटि आपके द्वारा लिखे गए फ़ंक्शन से आ रही है, तो आप इसे 'debugonce (function_name)' का उपयोग करके डीबग कर सकते हैं। यह आपको फ़ंक्शन के दायरे के अंदर एक मिनी आर सत्र देगा। – Justin

+0

यही वह है जो मैं कर रहा हूं, लेकिन मुझे लगता है कि मैं कुछ ऐसा करने पर बहुत अधिक समय बिताता हूं जो स्वचालित हो सकता है। – Tim

उत्तर

17

आप पिछली त्रुटि कहां से पता लगाने के लिए traceback() का उपयोग कर सकते हैं। आम तौर पर यह आपको आपके फ़ंक्शन में किए गए कॉल पर इंगित करेगा। तब मैं आमतौर पर उस बिंदु पर browser() डालता हूं, फिर फ़ंक्शन चलाता हूं और देखता हूं कि क्या गलत हो रहा है।

f2 <- function(x) 
{ 
    if (x==1) "foo" 
} 

f <- function(x) 
{ 
    f2(x) 
} 

ध्यान दें कि f2() लंबाई 1 का एक तर्क मान लिया गया है:

उदाहरण के लिए, यहाँ दो कार्य कर रहे हैं। हम f दुरुपयोग कर सकते हैं:

> f(NULL) 
Error in if (x == 1) "foo" : argument is of length zero 

अब हम traceback() उपयोग कर सकते हैं क्या गलत हुआ पता लगाने के लिए:

> traceback() 
2: f2(x) at #3 
1: f(NULL) 

संख्या का मतलब है कितना गहरा हम नेस्टेड कार्यों में कर रहे हैं। तो हम देखते हैं कि ff2 पर कॉल करता है और यह 3 पर एक त्रुटि देता है। बहुत स्पष्ट। हम f को browser के साथ फिर से सौंप सकते हैं f2 कॉल के पहले इसे इनपुट करने के लिए कॉल करें। browser() बस आपको एक फ़ंक्शन निष्पादित करने और अपने पर्यावरण में चारों ओर देखने की अनुमति देता है। debug और debugonce के समान, सिवाय इसके कि आपको उस बिंदु तक निष्पादित करने की आवश्यकता नहीं है जब तक आपको पता न हो कि कुछ गलत हो जाता है।

+0

नाइटपिक: यह तर्क नहीं है कि तर्क लंबाई> 0 है, यह 'if' कथन है। – naught101

16

बस @SachaEpskamp ने जो भी सुझाव दिया है उसे जोड़ने के लिए, options(error=recover) और options(show.error.locations=TRUE) को अपरिचित कोड डीबग करते समय बेहद सहायक हो सकता है। पहले कारणों से त्रुटि पर एक डिबगिंग सत्र लॉन्च करने के लिए आर आपको कारण बताता है कि कॉल में किसी भी बिंदु पर ब्राउजर को उस त्रुटि तक ढेर करने का विकल्प दिया जाता है। दूसरा विकल्प त्रुटि में स्रोत पंक्ति संख्या शामिल करने के लिए आर को बताएगा।

+2

अतिरिक्त रूप से, यदि आप 'विकल्प (चेतावनी = 2) सेट करते हैं, तो वही चेतावनी पर होगा, जो उपयोगी हो सकता है यदि आप कारकों को गलत तरीके से परिवर्तित कर रहे हैं (' एनए 'को प्रेरित करना, जो आम तौर पर आप नहीं चाहते हैं – richiemorrisroe

+0

तो मेरे विकल्पों को विकल्पों (त्रुटि = पुनर्प्राप्ति), विकल्प (show.error.locations = TRUE), और विकल्प (चेतावनी = 2) पर सेट करें, लेकिन इन विकल्पों को उनके मूल स्थिति में रीसेट करना चाहते हैं। मैं यह कैसे करूँगा? – stochasticcrap

+1

'o <- विकल्प (त्रुटि = पुनर्प्राप्ति, show.error.locations = TRUE, चेतावनी = 2); # सामान करें; do.call (विकल्प, ओ) # रीसेट 'अगर इस उत्तर में आपकी सहायता हुई तो अपवर्तित करने के लिए स्वतंत्र महसूस करें। –