आर में डिबगिंग के लिए सामान्य सुझाव


120

आर फ़ंक्शन का उपयोग करते समय मुझे एक त्रुटि मिलती है जो मैंने लिखा था:

Warning messages:
1: glm.fit: algorithm did not converge 
2: glm.fit: algorithm did not converge 

मैंने क्या किया है:

  1. समारोह के माध्यम से कदम
  2. यह पता लगाने के लिए कि कौन सी लाइन में त्रुटि होती है, यह पता लगाने के लिए दो फ़ंक्शंस का उपयोग करना चाहिए जिनका उपयोग नहीं करना चाहिए glm.fit। वे हैं window()और save()

मेरे सामान्य दृष्टिकोणों में जोड़ना printऔर stopकमांड शामिल हैं, और जब तक मैं अपवाद का पता नहीं लगा सकता, तब तक लाइन द्वारा एक फ़ंक्शन लाइन के माध्यम से कदम बढ़ाना।

हालाँकि, यह मेरे लिए उन तकनीकों का उपयोग करने के लिए स्पष्ट नहीं है जहां यह त्रुटि कोड से आती है। मुझे यह भी निश्चित नहीं है कि कोड के भीतर कौन से कार्य निर्भर करते हैं glm.fit। मैं इस समस्या का निदान कैसे करूँ?


5
डंकन मर्डोक के पेज को आर
रोब हाइंडमैन जूल 24'09

10
ठीक है, मैं स्पष्ट बताता हूँ: यह एक चेतावनी है एक त्रुटि नहीं है ।
गेविन सिम्पसन

10
@ गेविन-सिम्पसन मुझे महसूस नहीं हुआ कि तकनीकी अंतर था, जो इस ओर इशारा करने के लिए धन्यवाद। लेकिन अंत में, यह इंगित करता है कि मेरा पहले वाला कार्य निष्क्रिय है।
डेविड लेबॉउर

11
@ के लिए @ डेविड +1 ... मेरा पहला कार्यात्मक कार्य दुष्क्रियाशील है।
यहोशू उलरिक

5
@ डेविड: अपने पी.एस. यह उस प्रश्न को एक आयाम जोड़ता है जो उदाहरण के बिना याद किया गया होगा; जब केवल चेतावनी उत्पन्न की जाती है तो आर को डिबगिंग मोड में कैसे लाया जाए? यदि आपने इस विवरण को छोड़ दिया है, तो हम सभी को आपको इंगित नहीं करेंगे options(warn = 2)। तो इस मामले में, आपके सामान्य प्रश्न का उत्तर देने के लिए विवरण आवश्यक है। मुझ से +1।
गैविन सिम्पसन

जवाबों:


167

मैं कहूंगा कि डीबग करना एक कला है, इसलिए चांदी की कोई स्पष्ट गोली नहीं है। किसी भी भाषा में डिबगिंग के लिए अच्छी रणनीतियाँ हैं, और वे यहाँ भी लागू होते हैं (जैसे यह अच्छा लेख पढ़ें )। उदाहरण के लिए, पहली बात यह है कि समस्या को पुन: उत्पन्न करना है ... यदि आप ऐसा नहीं कर सकते हैं, तो आपको अधिक जानकारी प्राप्त करने की आवश्यकता है (जैसे लॉगिंग के साथ)। एक बार जब आप इसे पुन: पेश कर सकते हैं, तो आपको इसे स्रोत तक कम करने की आवश्यकता है ।

"ट्रिक" के बजाय, मैं कहूंगा कि मेरी पसंदीदा डिबगिंग रूटीन है:

  1. जब कोई त्रुटि होती है, तो पहली चीज जो मैं आमतौर पर करता हूं, वह कॉल द्वारा स्टैक ट्रेस को देखता है traceback(): जो आपको दिखाता है कि त्रुटि कहां हुई, जो विशेष रूप से उपयोगी है यदि आपके पास कई नेस्टेड फ़ंक्शन हैं।
  2. आगे मैं सेट करूँगा options(error=recover); यह तुरंत ब्राउज़र मोड में बदल जाता है जहां त्रुटि होती है, इसलिए आप वहां से कार्यक्षेत्र ब्राउज़ कर सकते हैं।
  3. यदि मेरे पास अभी भी पर्याप्त जानकारी नहीं है, तो मैं आमतौर पर debug()स्क्रिप्ट लाइन के माध्यम से फ़ंक्शन और चरण का उपयोग करता हूं ।

R 2.10 में सबसे अच्छी नई ट्रिक (स्क्रिप्ट फ़ाइलों के साथ काम करते समय) का उपयोग करना है findLineNum() और setBreakpoint()कार्यों है।

अंतिम टिप्पणी के रूप में: त्रुटि के आधार पर, यह सेट करने के लिए भी बहुत उपयोगी है try()tryCatch() बाहरी फ़ंक्शन कॉल (विशेषकर S4 कक्षाओं के साथ काम करते समय) के आसपास या स्टेटमेंट । यह कभी-कभी और भी अधिक जानकारी प्रदान करता है, और यह आपको यह भी नियंत्रित करता है कि रन टाइम पर त्रुटियों को कैसे नियंत्रित किया जाता है।

इन संबंधित प्रश्नों में बहुत सारे सुझाव हैं:


8
आप डीबगोनस () को डीबग () में भी जोड़ सकते हैं।
जोरिस मेय्स

2
हालांकि केवल डिबगिंग के समय ही उपयोगी नहीं है, फिक्स (df1) इसमें डेटा फ्रेम df1 के साथ ग्राफिकल आर एडिटर खोलता है जिसे आप मक्खी पर संपादित कर सकते हैं या बस एक नज़र डाल सकते हैं।
दिमित्रि आई।

R में डिबगिंग बहुत कठिन प्रतीत होती है, उदाहरण के लिए चेतावनियों की कोड लाइन्स देखने का कोई आसान उपाय नहीं है
TMS

browser()जब ऐसी त्रुटियाँ हों जो चेतावनी / त्रुटियों को ट्रिगर नहीं करती हैं (क्रेडिट: इस पृष्ठ पर रोमन लुसट्रिक)। किसी अन्य उपकरण की तरह browser()?
पैट्रिक

38

अब तक मैंने देखा है सबसे अच्छा walkthrough है:

http://www.biostat.jhsph.edu/%7Erpeng/docs/R-debug-tools.pdf

कोई सहमत / असहमत?


बहुत गहन गाइड- आर कोर में शामिल आवश्यक उपकरणों का वर्णन करता है: डीबग (), ट्रेसबैक () और पुनर्प्राप्त ()।
शार्प जूल

32

जैसा कि मुझे एक और प्रश्न में बताया गया था , Rprof()और आपके कार्यक्रम के धीमे भागोंsummaryRprof() को खोजने के लिए अच्छे उपकरण हैं जो कि C / C ++ कार्यान्वयन में तेजी लाने या बढ़ने से लाभान्वित हो सकते हैं। यह संभवत: अधिक लागू होता है यदि आप सिमुलेशन कार्य या अन्य कम्प्यूट- या डेटा-गहन गतिविधियों को कर रहे हैं। profrपैकेज परिणाम visualizing कर सकते हैं।

मैं एक सीख-डिबगिंग किक के एक बिट पर हूं, इसलिए एक और धागे से एक और सुझाव :

  • options(warn=2)त्रुटियों की तरह चेतावनी का इलाज करने के लिए सेट करें

आप optionsअपनी पसंद के डिबगिंग फ़ंक्शन का उपयोग करके, त्रुटि या चेतावनी होने पर कार्रवाई की गर्मी में आपको सही ड्रॉप करने के लिए भी उपयोग कर सकते हैं । उदाहरण के लिए:

  • जब कोई त्रुटि होती है, तो options(error=recover)चलाने के लिए सेट करें recover(), जैसा कि शेन ने उल्लेख किया है (और जैसा कि आर डिबगिंग गाइड में प्रलेखित है । या कोई भी अन्य उपयोगी फ़ंक्शन आपको चलाने के लिए उपयोगी लगेगा।

और @ शेन के लिंक में से एक और दो तरीके :

  • एक आंतरिक फ़ंक्शन कॉल के साथ लपेटें try()उस पर अधिक जानकारी वापस करने के लिए ।
  • लागू कार्यों के लिए .inform=TRUEएक विकल्प के रूप में (प्लाई पैकेज से) का उपयोग करें

@JoshuaUlrich ने क्लासिक browser()कमांड की सशर्त क्षमताओं का उपयोग करके चालू / बंद डिबगिंग का एक साफ तरीका बताया :

  • उस फ़ंक्शन के अंदर रखें जिसे आप डीबग करना चाहते हैं browser(expr=isTRUE(getOption("myDebug")))
  • और द्वारा वैश्विक विकल्प सेट करें options(myDebug=TRUE)
  • आप ब्राउज़र कॉल को भी लपेट सकते हैं: myBrowse <- browser(expr=isTRUE(getOption("myDebug")))और तब से कॉल करें myBrowse()जब तक यह ग्लोबल्स का उपयोग करता है।

उसके बाद R 2.10 में नए कार्य उपलब्ध हैं:

  • findLineNum()एक स्रोत फ़ाइल नाम और लाइन नंबर लेता है और फ़ंक्शन और वातावरण लौटाता है। ऐसा लगता है कि जब आप source().R फ़ाइल में सहायक होते हैं और यह लाइन #n पर एक त्रुटि देता है, लेकिन आपको यह जानना आवश्यक है कि कौन सा फ़ंक्शन लाइन #n पर स्थित है।
  • setBreakpoint() एक स्रोत फ़ाइल नाम और लाइन नंबर लेता है और वहां एक ब्रेकपॉइंट सेट करता है

Codetools पैकेज है, और विशेष रूप से अपने checkUsageसमारोह विशेष रूप से उपयोगी जल्दी से वाक्य रचना और शैलीगत त्रुटियों कि एक संकलक आम तौर पर रिपोर्ट करेंगे उठा (अनुपयुक्त स्थानीय लोगों, वैश्विक कार्य करता है और चर, आंशिक तर्क मिलान अपरिभाषित, और आगे) हो सकता है।

setBreakpoint()एक अधिक उपयोगकर्ता के अनुकूल फ्रंट-एंड है trace()हाल ही के आर जर्नल लेख में यह कैसे काम करता है, इसके विवरण पर जानकारी दी गई है ।

आप डिबग किसी और के पैकेज की कोशिश कर रहे हैं, तो आप एक बार आप समस्या का पता चला है सकते हैं उनके कार्यों पर लिखने के साथ fixInNamespaceऔर assignInNamespaceहै, लेकिन उत्पादन कोड में इसके उपयोग नहीं करते।

इसमें से किसी को भी कोशिश की और मानक आर डिबगिंग टूल्स को नहीं छोड़ना चाहिए , जिनमें से कुछ ऊपर हैं और जिनमें से अन्य नहीं हैं। विशेष रूप से, पोस्ट-मॉर्टम डिबगिंग टूल तब उपयोगी होते हैं जब आपके पास कोड का एक समय लेने वाला गुच्छा होता है जिसे आप फिर से चलाना नहीं चाहते हैं।

अंत में, मुश्किल समस्याओं के लिए जो एक त्रुटि संदेश फेंकने के लिए प्रतीत नहीं होते हैं, आप options(error=dump.frames)इस प्रश्न में विस्तृत रूप से उपयोग कर सकते हैं : त्रुटि के बिना त्रुटि फेंकी जा रही है


1
+1 उन सभी कार्यों के लिए जिन्हें आपने इन प्रश्नों को एक में विलय करने और फिर इसे खुला रखने में लगाया है!
जीएसआई

29

कुछ बिंदु पर, glm.fitबुलाया जा रहा है। इसका मतलब है कि आप जिन फ़ंक्शन को कॉल करते हैं या उन फ़ंक्शन द्वारा कॉल किए गए कार्यों में से एक का उपयोग कर रहा है glm, या glm.fit

इसके अलावा, जैसा कि मैंने ऊपर अपनी टिप्पणी में उल्लेख किया है, कि एक चेतावनी एक त्रुटि नहीं है , जो एक बड़ा अंतर बनाती है। आप किसी चेतावनी से R के डिबगिंग टूल को ट्रिगर नहीं कर सकते हैं (डिफ़ॉल्ट विकल्पों के साथ कोई मुझे बताता है कि मैं गलत हूं;;

यदि हम चेतावनियों को त्रुटियों में बदलने के लिए विकल्प बदलते हैं तो हम आर के डीबगिंग टूल का उपयोग करना शुरू कर सकते हैं। से ?optionsहमने:

 ‘warn’: sets the handling of warning messages.  If ‘warn’ is
      negative all warnings are ignored.  If ‘warn’ is zero (the
      default) warnings are stored until the top-level function
      returns.  If fewer than 10 warnings were signalled they will
      be printed otherwise a message saying how many (max 50) were
      signalled.  An object called ‘last.warning’ is created and
      can be printed through the function ‘warnings’.  If ‘warn’ is
      one, warnings are printed as they occur.  If ‘warn’ is two or
      larger all warnings are turned into errors.

तो अगर तुम दौड़ो

options(warn = 2)

फिर अपना कोड चलाएं, आर एक त्रुटि फेंक देगा। किस मोड़ पर, आप दौड़ सकते थे

traceback()

कॉल स्टैक देखने के लिए। यहाँ एक उदाहरण है।

> options(warn = 2)
> foo <- function(x) bar(x + 2)
> bar <- function(y) warning("don't want to use 'y'!")
> foo(1)
Error in bar(x + 2) : (converted from warning) don't want to use 'y'!
> traceback()
7: doWithOneRestart(return(expr), restart)
6: withOneRestart(expr, restarts[[1L]])
5: withRestarts({
       .Internal(.signalCondition(simpleWarning(msg, call), msg, 
           call))
       .Internal(.dfltWarn(msg, call))
   }, muffleWarning = function() NULL)
4: .signalSimpleWarning("don't want to use 'y'!", quote(bar(x + 
       2)))
3: warning("don't want to use 'y'!")
2: bar(x + 2)
1: foo(1)

यहां आप चिह्नित 4:और उच्चतर फ़्रेमों को अनदेखा कर सकते हैं । हम देखते हैं कि fooकहा जाता है barऔर यह barचेतावनी उत्पन्न करता है। यह आपको दिखाना चाहिए कि कौन से फ़ंक्शन कॉल कर रहे थे glm.fit

यदि आप अब इसे डीबग करना चाहते हैं, तो हम आर को डीबगर में प्रवेश करने के लिए आर को बताने के लिए एक अन्य विकल्प की ओर मुड़ सकते हैं जब यह एक त्रुटि का सामना करता है, और जैसा कि हमने चेतावनियों को गलत कर दिया है, जब मूल चेतावनी शुरू होने पर हमें डीबगर मिल जाएगा। उसके लिए आपको दौड़ना चाहिए:

options(error = recover)

यहाँ एक उदाहरण है:

> options(error = recover)
> foo(1)
Error in bar(x + 2) : (converted from warning) don't want to use 'y'!

Enter a frame number, or 0 to exit   

1: foo(1)
2: bar(x + 2)
3: warning("don't want to use 'y'!")
4: .signalSimpleWarning("don't want to use 'y'!", quote(bar(x + 2)))
5: withRestarts({
6: withOneRestart(expr, restarts[[1]])
7: doWithOneRestart(return(expr), restart)

Selection:

फिर आप उन फ़्रेमों में से किसी में भी देख सकते हैं कि जब चेतावनी दी गई थी तब क्या हो रहा था।

उपरोक्त विकल्पों को उनके डिफ़ॉल्ट पर रीसेट करने के लिए, दर्ज करें

options(error = NULL, warn = 0)

आपके द्वारा बोली जाने वाली विशिष्ट चेतावनी के लिए, यह अत्यधिक संभावना है कि आपको कोड में अधिक पुनरावृत्तियों की अनुमति देने की आवश्यकता है। एक बार जब आपको पता चल जाए कि कॉलिंग क्या है glm.fit, तो controlतर्क का उपयोग करके इसे पास करने का तरीका glm.controlदेखें - देखें ?glm.control


4
बहुत बढ़िया जवाब। निराशावाद का एक नोट यह है कि इस प्रकार की अभिसरण त्रुटियां अक्सर अस्थिर / विस्की डेटा सेट (पूर्ण पृथक्करण, आदि) के साथ होती हैं, और 'सम्‍मिलित बस ठीक' और 'गैर-अभिसरण' के बीच की विंडो बढ़ती संख्या से तय नहीं की जा सकती है पुनरावृत्तियों - कुछ और कठोर बदलावों की आवश्यकता है 'अक्सर संकीर्ण होता है
बेन बोल्कर

3
गेविन, मैंने आपको 25 सेकंड से हराया। मैं मांग करता हूं कि आप अपने अति-उपयोगी उत्तर को हटा दें और मेरे अपवित्र चोरी करना बंद करें। ;-)
जोशुआ उलरिच

@ बहुत बढ़िया बात। यदि डेविड का मुद्दा अलग हो रहा है तो पुनरावृत्तियों की संख्या बढ़ने से मदद नहीं मिलनी चाहिए, फिर भी इसे अभिसरण करने में विफल होना चाहिए। उस बिंदु पर अनुमान और मानक त्रुटियों को देखते हुए समस्या हो सकती है। मैं यह भी उम्मीद करूंगा कि यदि अलग या इसी तरह की समस्या थी तो मैं फिटेड वैल्यू के बारे में चेतावनी 0 या 1 देख सकता हूँ। यदि पुनरावृत्तियों की संख्या को कम करने में मदद नहीं मिलती है, तो डेविड मदद के लिए एक और क्यू पोस्ट कर सकता है और मैं @ जोशुआ के अपवोट्स को और अधिक चुरा सकता हूं ;-)
गेविन सिम्पसन

1
@ जोशुआ, उसे हराने का कोई तरीका नहीं है। मैंने उन अपवोटों को गिनना बंद कर दिया है जिनकी वजह से मैं हार सकता था। लेकिन वैसे भी वह मदद के लिए अब तक कि खाते प्रदान करते हैं। मिल जाएगा अपने खुद के niches आप उसे हरा रहे थे। मेरा सुझाव है कि प्रति कीस्ट्रोके यहाँ तक
पहुँचते

1
दामित @ ran2, आपने मेरी नृशंस, कुटिल योजना को दुनिया के ऊपर ले जाने के लिए नाकाम कर दिया , म्हाअहहहहह !!!!
गेविन सिम्पसन

21

तो browser(), traceback()और debug()एक बार में चलो, लेकिन trace()बाहर इंतजार करता है और मोटर को चालू रखता है।

browserअपने फ़ंक्शन में कहीं भी सम्मिलित करने से , निष्पादन रुक जाएगा और आपके इनपुट की प्रतीक्षा करेगा। आप n(या Enter) का उपयोग करके आगे बढ़ सकते हैं , पूरे चंक (चलना) cको चालू कर सकते हैं, वर्तमान लूप / फ़ंक्शन को समाप्त कर सकते हैं fया साथ छोड़ सकते हैं Q; देखते हैं ?browser

के साथ debug, आपको ब्राउज़र के समान प्रभाव मिलता है, लेकिन यह शुरुआत में एक फ़ंक्शन का निष्पादन रोक देता है। वही शॉर्टकट लागू होते हैं। यह फ़ंक्शन एक "डीबग" मोड में होगा जब तक कि आप इसे बंद नहीं करते undebug(यानी, बाद में debug(foo), फ़ंक्शन चलाने पर foo"डिबग" मोड हर बार जब तक आप रन नहीं करेंगे undebug(foo))।

एक अधिक क्षणिक विकल्प है debugonce, जो अगली बार मूल्यांकन के बाद फ़ंक्शन से "डीबग" मोड को हटा देगा।

traceback आपको उन कार्यों के निष्पादन का प्रवाह प्रदान करेगा जहां कुछ गलत हुआ (वास्तविक त्रुटि)।

traceउदाहरण के लिए, आप फ़ंक्शंस में कोड बिट्स (यानी कस्टम फ़ंक्शंस) सम्मिलित कर सकते हैं browser। यह पैकेज से कार्यों के लिए उपयोगी है और आप अच्छी तरह से मुड़ा स्रोत कोड प्राप्त करने के लिए बहुत आलसी हैं।


18

मेरी सामान्य रणनीति इस प्रकार है:

  1. traceback()स्पष्ट मुद्दों के लिए देखने के लिए चलाएँ
  2. options(warn=2)त्रुटियों की तरह चेतावनी का इलाज करने के लिए सेट करें
  3. options(error=recover)त्रुटि पर कॉल स्टैक में कदम रखने के लिए सेट करें

15

यहाँ सुझाए गए सभी चरणों से गुजरने के बाद मैंने सिर्फ इतना ही सीखा कि सेटिंग .verbose = TRUEमें foreach()भी मुझे बहुत सारी उपयोगी जानकारी मिलती है। विशेष रूप से foreach(.verbose=TRUE)दिखाता है कि फ़ॉरच लूप के अंदर कोई त्रुटि होती है, जबकि traceback()फ़ॉरच लूप के अंदर नहीं दिखता है।


13

मार्क ब्रेसिंगटन का डिबगर जो debugCRAN पर पैकेज के रूप में उपलब्ध है, बहुत अच्छा और बहुत सीधा आगे है।

library(debug);
mtrace(myfunction);
myfunction(a,b);
#... debugging, can query objects, step, skip, run, breakpoints etc..
qqq(); # quit the debugger only
mtrace.off(); # turn off debugging

कोड एक हाइलाइट किए गए Tk विंडो में पॉप अप होता है ताकि आप देख सकें कि क्या चल रहा है और निश्चित रूप से आप mtrace()एक अलग फ़ंक्शन में एक और कॉल कर सकते हैं ।

HTH


11

मुझे गैविन का उत्तर पसंद है: मुझे विकल्पों (त्रुटि = पुनर्प्राप्ति) के बारे में नहीं पता था। मुझे 'डीबग' पैकेज का उपयोग करना भी पसंद है जो आपके कोड के माध्यम से कदम रखने का एक दृश्य तरीका देता है।

require(debug)
mtrace(foo)
foo(1)

इस बिंदु पर यह आपके फ़ंक्शन को दिखाते हुए एक अलग डिबग विंडो खोलता है, जिसमें एक पीली लाइन दिखाई देती है जहां आप कोड में हैं। मुख्य विंडो में कोड डिबग मोड में प्रवेश करता है, और आप कोड के माध्यम से कदम रखने के लिए एंट्री मार सकते हैं (और साथ ही अन्य कमांड भी हैं), और चर मानों की जांच करते हैं, आदि डिबग विंडो में पीली लाइन यह दिखाने के लिए चलती रहती है कि कहां आप कोड में हैं। जब डिबगिंग के साथ किया जाता है, तो आप इसके साथ ट्रेसिंग को बंद कर सकते हैं:

mtrace.off()

5

मेरे द्वारा यहां दिए गए उत्तर के आधार पर , आपको निश्चित रूप से options(error=recover)सेटिंग की जांच करनी चाहिए । जब यह सेट हो जाता है, तो एक त्रुटि का सामना करने पर, आपको निम्न ( tracebackआउटपुट) के समान कंसोल पर टेक्स्ट दिखाई देगा :

> source(<my filename>)
Error in plot.window(...) : need finite 'xlim' values
In addition: Warning messages:
1: In xy.coords(x, y, xlabel, ylabel, log) : NAs introduced by coercion
2: In min(x) : no non-missing arguments to min; returning Inf
3: In max(x) : no non-missing arguments to max; returning -Inf

Enter a frame number, or 0 to exit   

1: source(<my filename>)
2: eval.with.vis(ei, envir)
3: eval.with.vis(expr, envir, enclos)
4: LinearParamSearch(data = dataset, y = data.frame(LGD = dataset$LGD10), data.names = data
5: LinearParamSearch.R#66: plot(x = x, y = y.data, xlab = names(y), ylab = data.names[i])
6: LinearParamSearch.R#66: plot.default(x = x, y = y.data, xlab = names(y), ylab = data.nam
7: LinearParamSearch.R#66: localWindow(xlim, ylim, log, asp, ...)
8: LinearParamSearch.R#66: plot.window(...)

Selection:

किस बिंदु पर आप चुन सकते हैं कि कौन सा "फ्रेम" दर्ज करना है। जब आप एक चयन करते हैं, तो आपको browser()मोड में रखा जाएगा :

Selection: 4
Called from: stop(gettextf("replacement has %d rows, data has %d", N, n), 
    domain = NA)
Browse[1]> 

और आप पर्यावरण की जांच कर सकते हैं क्योंकि यह त्रुटि के समय था। जब आप कर लें, cतो आपको फ्रेम चयन मेनू में वापस लाने के लिए टाइप करें। जब आप पूरा कर लें, जैसा कि यह आपको बताता है, 0बाहर निकलने के लिए टाइप करें।


4

मैंने यह उत्तर एक और हालिया प्रश्न के लिए दिया है, लेकिन इसे पूर्णता के लिए यहां जोड़ रहा हूं।

व्यक्तिगत रूप से मैं डीबग करने के लिए फ़ंक्शन का उपयोग नहीं करता हूं। मुझे अक्सर लगता है कि यह उतनी ही परेशानी का कारण बनता है जितना कि यह हल करता है। इसके अलावा, मैटलैब बैकग्राउंड से आना मुझे कोड में ऐसा करने के बजाय एक एकीकृत विकास वातावरण (आईडीई) में करने में सक्षम होना पसंद है। आईडीई का उपयोग करने से आपका कोड साफ और सरल रहता है।

आर के लिए, मैं "RStudio" ( http://www.rstudio.com ) नामक एक आईडीई का उपयोग करता हूं , जो विंडोज़, मैक और लिनक्स के लिए उपलब्ध है और उपयोग करने के लिए बहुत आसान है।

अक्टूबर 2013 के बाद से Rstudio के संस्करण (0.98ish?) में स्क्रिप्ट और फ़ंक्शंस में ब्रेकप्वाइंट जोड़ने की क्षमता है: ऐसा करने के लिए, ब्रेकप्वाइंट जोड़ने के लिए बस फ़ाइल के बाएं मार्जिन पर क्लिक करें। आप एक ब्रेकपॉइंट सेट कर सकते हैं और फिर उस बिंदु से कदम बढ़ा सकते हैं। आपके पास उस वातावरण के सभी डेटा तक भी पहुंच है, इसलिए आप कमांड का प्रयास कर सकते हैं।

देखें http://www.rstudio.com/ide/docs/debugging/overview जानकारी के लिए। यदि आपके पास पहले से ही Rstudio स्थापित है, तो आपको अपग्रेड करने की आवश्यकता हो सकती है - यह अपेक्षाकृत नया (2013 के अंत में) सुविधा है।

आपको अन्य IDE भी मिल सकते हैं जिनकी कार्यक्षमता समान है।

बेशक, अगर यह एक अंतर्निहित कार्य है, तो आपको इस चर्चा में अन्य लोगों द्वारा किए गए कुछ सुझावों का सहारा लेना पड़ सकता है। लेकिन, यदि यह आपका अपना कोड है जिसे ठीक करने की आवश्यकता है, तो एक आईडीई-आधारित समाधान सिर्फ वही हो सकता है जिसकी आपको आवश्यकता है।


1

उदाहरण संदर्भ के बिना संदर्भ वर्ग विधियों को डीबग करना

ClassName$trace(methodName, browser)

0

मुझे लगता है कि त्रुटि रेखा संख्या को नहीं छापना शुरू कर रहा हूं - एक सबसे बुनियादी आवश्यकता - BY DEFAILT- आर / Rstudio में किसी प्रकार का मजाक है । एकमात्र विश्वसनीय तरीका मैंने पाया है कि जहां एक त्रुटि हुई है, ट्रेसिंगबैक () के अतिरिक्त प्रयास करने और शीर्ष पंक्ति को देखने के लिए।

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