আর-এ ডিবাগ করার জন্য সাধারণ পরামর্শ


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। আমি কীভাবে এই সমস্যাটি নির্ণয় করতে পারি?



10
ঠিক আছে, আমি স্পষ্ট করে বলব: এটি একটি ত্রুটি নয় সতর্কতা
গ্যাভিন সিম্পসন

10
@ গাভিন-সিম্পসন আমি বুঝতে পারি নি যে প্রযুক্তিগত পার্থক্য রয়েছে, এটি উল্লেখ করার জন্য ধন্যবাদ। তবে শেষ পর্যন্ত এটি ইঙ্গিত দেয় যে আমার আগের কার্যকরী কার্যকারিতা অকার্যকর।
ডেভিড লেবাউর

11
"ডেভিড +1 এর জন্য" ... আমার আগের কার্যকারিতাটি অকার্যকর ""
জোশুয়া আলরিখ

5
@ ডেভিড: আপনার পিএস আবার। এটি প্রশ্নের এমন একটি মাত্রা যুক্ত করে যা উদাহরণ ছাড়াই মিস হত; যখন কেবল সতর্কতা উত্পন্ন হবে তখন ডিবাগিং মোডে কীভাবে আর পদক্ষেপ নেবেন? আপনি যদি এই বিশদটি বাইরে রেখে থাকেন তবে আমরা সকলেই আপনাকে নির্দেশ করব না options(warn = 2)। সুতরাং এই ক্ষেত্রে, বিস্তারিত আপনার সাধারণ প্রশ্নের উত্তর দেওয়ার জন্য প্রয়োজনীয়। আমার কাছ থেকে +1
গ্যাভিন সিম্পসন

উত্তর:


167

আমি বলব যে ডিবাগিং একটি শিল্প ফর্ম, সুতরাং সিলভারের কোনও পরিষ্কার বুলেট নেই। যে কোনও ভাষায় ডিবাগিংয়ের জন্য ভাল কৌশল রয়েছে এবং তারা এখানেও প্রয়োগ করে (যেমন এই চমৎকার নিবন্ধটি পড়ুন )। উদাহরণস্বরূপ, প্রথম জিনিসটি সমস্যাটি পুনরুত্পাদন করা হয় ... আপনি যদি এটি করতে না পারেন তবে আপনার আরও তথ্য (যেমন লগিং সহ) পেতে হবে। একবার আপনি এটি পুনরুত্পাদন করতে পারেন, আপনার এটি উত্স থেকে কমিয়ে আনা দরকার ।

একটি "কৌশল" পরিবর্তে, আমি বলতে চাই যে আমার একটি প্রিয় ডিবাগিং রুটিন রয়েছে:

  1. যখন কোনও ত্রুটি দেখা দেয়, আমি প্রথমে যা করি তা হ'ল ফোন করে স্ট্যাকের সন্ধান করা traceback(): এটি আপনাকে দেখায় যে ত্রুটিটি কোথায় ঘটেছে, যা বিশেষত কার্যকর যদি আপনার বেশ কয়েকটি নেস্টেড ফাংশন থাকে।
  2. পরবর্তী আমি সেট করব options(error=recover); এটি তত্ক্ষণাত ব্রাউজার মোডে স্যুইচ করে যেখানে ত্রুটি দেখা দেয়, তাই আপনি সেখান থেকে কর্মক্ষেত্রটি ব্রাউজ করতে পারেন।
  3. যদি এখনও আমার কাছে পর্যাপ্ত তথ্য না থাকে তবে আমি সাধারণত debug()ফাংশনটি ব্যবহার করি এবং স্ক্রিপ্ট লাইন দিয়ে লাইনে ধাপে ধাপে।

আর ২.১০ এর সেরা নতুন কৌশলটি (স্ক্রিপ্ট ফাইলগুলির সাথে কাজ করার সময়) হ'ল findLineNum()এবং setBreakpoint()ফাংশনগুলি ব্যবহার করা ।

চূড়ান্ত মন্তব্য হিসাবে: ত্রুটির উপর নির্ভর করে, বাহ্যিক ফাংশন কলগুলির আশেপাশে (বিশেষত এস 4 শ্রেণির সাথে ডিল করার সময়) সেট করা try()বা tryCatch()বিবৃতি দেওয়া খুব সহায়ক । এটি মাঝেমধ্যে আরও বেশি তথ্য সরবরাহ করবে এবং রান টাইমে ত্রুটিগুলি কীভাবে পরিচালনা করা হয় তার উপর এটি আপনাকে আরও নিয়ন্ত্রণ দেয়।

এই সম্পর্কিত প্রশ্নগুলির অনেক পরামর্শ রয়েছে:


8
আপনি ডিবাগ () পাশাপাশি ডিবাগনস () যুক্ত করতে পারেন।
জোরিস মেয়েস

2
যদিও ডিবাগ করার সময় কেবল দরকারী নয়, ফিক্স (ডিএফ 1) এতে গ্রাফিকাল আর এডিটরটি খচিত ডেটা ফ্রেম ডিএফ 1 লোড রয়েছে যা আপনি ফ্লাইতে সম্পাদনা করতে পারেন বা কেবল একবার নজর দিতে পারেন।
দিমিত্রি আই।

আর-এ ডিবাগ করা খুব কঠিন বলে মনে হচ্ছে উদাহরণস্বরূপ সতর্কতার কোড লাইনগুলি দেখার সহজ সমাধান নেই
টিএমএস

browser()সতর্কতা / ত্রুটিগুলি ট্রিগার না করে এমন ত্রুটি রয়েছে (ক্রেডিট: রোমান লুয়েট্রিক এই পৃষ্ঠায়)। অন্য কোন সরঞ্জামের মতো browser()?
প্যাট্রিকটি

38

আমি এখনও অবধি সবচেয়ে ভাল ওয়াকথ্রু দেখেছি:

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

কেউ রাজি / অসমত?


খুব পুঙ্খানুপুঙ্খ গাইড- আর কোর অন্তর্ভুক্ত প্রয়োজনীয় সরঞ্জামগুলি বর্ণনা করে: ডিবাগ (), ট্রেসব্যাক () এবং পুনরুদ্ধার ()।
শার্পি

32

হিসাবে আমার জন্য নির্দিষ্ট ছিল আরেকটি প্রশ্ন , Rprof()এবং summaryRprof()সুন্দর হাতিয়ার আপনার প্রোগ্রাম ধীর অংশের এটি যে দ্রুত গাড়ী চালানোর বা সি / সি ++ বাস্তবায়নে চলন্ত থেকে শক্তি লাভ। যদি আপনি সিমুলেশন কাজ বা অন্যান্য গণনা- বা ডেটা-নিবিড় ক্রিয়াকলাপ করেন তবে এটি সম্ভবত আরও বেশি প্রযোজ্য। profrপ্যাকেজ ফলাফল visualizing সাহায্য করতে পারেন।

আমি কিছুটা শিখুন-সম্পর্কে-ডিবাগিং কিক, তাই অন্য থ্রেড থেকে অন্য পরামর্শ :

  • options(warn=2)সতর্কতাগুলি ত্রুটির মতো আচরণ করার জন্য সেট করুন

এছাড়াও আপনি ব্যবহার করতে পারেন optionsযখন একটি ত্রুটি বা সতর্কতা ঘটে, আপনার পছন্দের প্রিয় ডিবাগিং ফাংশন ব্যবহার করে ডান কর্মের তাপ তোমাকে ড্রপ। এই ক্ষেত্রে:

  • কোনও ত্রুটি দেখা দিলে options(error=recover)রান করার জন্য সেট করুন recover(), যেমন শেন উল্লেখ করেছেন (এবং যেমনটি আর ডিবাগিং গাইডে নথিভুক্ত করা হয়েছে Or

এবং শ্যানের লিঙ্কগুলির মধ্যে একটি থেকে আরও দুটি পদ্ধতি :

  • try()এটিতে আরও তথ্য ফিরে পেতে একটি অভ্যন্তরীণ ফাংশন কলটি মোড়ক করুন।
  • অ্যাপ্লিকেশন ফাংশনগুলির .inform=TRUEজন্য, প্রয়োগ কমান্ডের বিকল্প হিসাবে (প্লাইর প্যাকেজ থেকে) ব্যবহার করুন

@ জোশুয়া অলিরিচ ডিবাগিং চালু / বন্ধ করার জন্য ক্লাসিক কমান্ডের শর্তসাপেক্ষ দক্ষতা ব্যবহারের একটি ঝরঝরে উপায়ও নির্দেশ করেছেনbrowser() :

  • আপনি ডিবাগ করতে পারেন ফাংশন ভিতরে রাখুন browser(expr=isTRUE(getOption("myDebug")))
  • এবং দ্বারা বৈশ্বিক বিকল্প সেট করুন options(myDebug=TRUE)
  • এমনকি আপনি ব্রাউজার কলটিও গুটিয়ে রাখতে পারেন : myBrowse <- browser(expr=isTRUE(getOption("myDebug")))এবং তারপরে কল করুন myBrowse()যেহেতু এটি গ্লোবালগুলি ব্যবহার করে।

তারপরে আর 2.10 তে নতুন ফাংশন উপলব্ধ রয়েছে:

  • findLineNum()একটি উত্স ফাইলের নাম এবং লাইন নম্বর নেয় এবং ফাংশন এবং পরিবেশ প্রদান করে। আপনি source()একটি আরআর ফাইল যখন এটি সহায়ক বলে মনে হচ্ছে এবং এটি #n লাইনে একটি ত্রুটি দেখায়, তবে আপনাকে কী লাইন #n এ অবস্থিত তা জানতে হবে।
  • setBreakpoint() একটি উত্স ফাইলের নাম এবং লাইন নম্বর নেয় এবং সেখানে একটি ব্রেকপয়েন্ট সেট করে

Codetools প্যাকেজ, বিশেষত তার checkUsageফাংশন বিশেষ সহায়ক দ্রুত সিনট্যাক্স এবং রচনাশৈলীসংক্রান্ত ত্রুটি করে একটি কম্পাইলার সাধারণত প্রতিবেদন হবে গোছগাছ মধ্যে (অব্যবহৃত স্থানীয়দের, গ্লোবাল ফাংশন এবং ভেরিয়েবল, আংশিক যুক্তি ম্যাচিং অনির্ধারিত, এবং তাই ঘোষণা) হতে পারে।

setBreakpoint()এটি আরও বেশি ব্যবহারকারী-বান্ধব ফ্রন্ট-এন্ড trace()সাম্প্রতিক আর জার্নাল নিবন্ধে এটি কীভাবে কাজ করে তার ইন্টার্নাল সম্পর্কিত বিশদ ।

আপনি ডিবাগ অন্য কারো প্যাকেজ বের করার চেষ্টা হয়, আপনি একবার আপনি সমস্যা অবস্থিত থাকতে পারে তাদের ফাংশন ওভার লিখতে সঙ্গে fixInNamespaceএবং assignInNamespaceকিন্তু উৎপাদন কোডে এই ব্যবহার করবেন না।

এর কোনওটিই চেষ্টা করা-এবং-সত্যের স্ট্যান্ডার্ড আর ডিবাগিং সরঞ্জামগুলিকে আটকায় না , যার কয়েকটি উপরে রয়েছে এবং যার মধ্যে নেই। বিশেষত, যখন আপনার সময়-গ্রাহক কোড থাকে যা আপনি আবার চালাতে চান না তখন পোস্ট-মর্টেম ডিবাগিং সরঞ্জামগুলি কার্যকর

অবশেষে, এমন জটিল সমস্যার জন্য যা কোনও ত্রুটি বার্তা ছুঁড়েছে বলে মনে হচ্ছে না, আপনি options(error=dump.frames)এই প্রশ্নটিতে বিস্তারিত হিসাবে ব্যবহার করতে পারেন : কোনও ত্রুটি ছাড়াই ত্রুটি


1
এই প্রশ্নগুলিকে একটিতে মার্জ করা এবং তারপরে এটি উন্মুক্ত রেখে দেওয়া সমস্ত কাজের জন্য +1!
জিএসি

29

কিছু সময়, glm.fitডাকা হচ্ছে। ফাংশন আপনাকে কল মাধ্যমে এক বা ফাংশন যারা ফাংশন ডাকা হয় ব্যবহার করছে হল যে glm, glm.fit

এছাড়াও, আমি উপরে আমার মন্তব্যে উল্লেখ, যে একটি হল সতর্কবার্তা নয় ত্রুটি , যা একটি বড় পার্থক্য তোলে। আপনি কোনও সতর্কতা থেকে আর এর ডিবাগিং সরঞ্জামগুলির কোনওটি ট্রিগার করতে পারবেন না (কেউ আমাকে ভুল বলার আগে আমি ডিফল্ট বিকল্প দিয়ে ;-)।

সতর্কতাগুলিকে ত্রুটিতে পরিণত করতে যদি আমরা বিকল্পগুলি পরিবর্তন করি তবে আমরা আর এর ডিবাগিং সরঞ্জামগুলি ব্যবহার শুরু করতে পারি। আমাদের থেকে ?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

আপনি যদি এখন এটি ডিবাগ করতে চান, আমরা আর কোনও বিকল্পের দিকে ফিরে যেতে পারি যখন এটির ত্রুটির মুখোমুখি হওয়ার সময় ডিবাগারটি enterুকতে বলা হয় এবং আমরা যখন সতর্কবার্তা ত্রুটি করেছি তখন আমরা যখন মূল সতর্কতাটি ট্রিগার করা হবে তখন আমরা একটি ডিবাগারটি পেয়ে যাব। তার জন্য আপনার চালানো উচিত:

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
দুর্দান্ত উত্তর হতাশাবাদের একটি নোট হ'ল এই ধরণের রূপান্তর ত্রুটিগুলি প্রায়শই অস্থির / উইঙ্কি ডেটা সেট (সম্পূর্ণ বিচ্ছেদ ইত্যাদি) এর সাথে ঘটে থাকে এবং 'কনভার্স্ট ঠিক জরিমানা' এবং 'নন-কনভার্জেন্টের মধ্যে থাকা উইন্ডোটি সংখ্যায় বাড়িয়ে সংশোধন করা যায় না increasing পুনরাবৃত্তির - আরও কিছু কঠোর পরিবর্তনের প্রয়োজন 'প্রায়শই সংকীর্ণ
বেন বলকার

3
গ্যাভিন, আমি আপনাকে 25 সেকেন্ডের ব্যবধানে পরাজিত করব। আমি আপনাকে আপনার অত্যধিক সহায়ক উত্তর সরানোর এবং আমার উপন্যাসগুলি চুরি করা বন্ধ করার দাবি করছি। ;-)
জোশুয়া উলিরিচ

@ বেইন পয়েন্ট যদি ডেভিডের ইস্যুটি বিচ্ছেদ হয় তবে পুনরাবৃত্তির সংখ্যা বৃদ্ধি করা উচিত নয়, এটি এখনও রূপান্তর করতে ব্যর্থ হওয়া উচিত। এই মুহূর্তে অনুমান এবং মান ত্রুটিগুলি দেখে মনে হতে পারে যে কোনও সমস্যা আছে। আমি পৃথক বা অনুরূপ কোনও সমস্যা হলে সংখ্যাসূচকভাবে 0 বা 1 সংযুক্ত মানগুলির সম্পর্কে সতর্কতাটিও দেখতে আশা করব expect যদি পুনরাবৃত্তির সংখ্যার উচ্চতা বৃদ্ধি না করে তবে ডেভিড সাহায্যের জন্য আরও একটি কিউ পোস্ট করতে পারে এবং আমি জোশুয়া-র আরও অনেকগুলি চুরি করতে পারি ;-)
গ্যাভিন সিম্পসন

1
@ জোশুয়া, তাকে মারধর করার উপায় নেই। আমি তার কারণে আমি যে ক্ষতিগুলি হারিয়েছি তা গণনা করা বন্ধ করে দিয়েছি। তবে যাইহোক যেভাবে তিনি তার জন্য অ্যাকাউন্ট সরবরাহ করতে সহায়তা করুন। আপনি তাকে মারধর করার সময় আপনার নিজের কুলুঙ্গি খুঁজে পেতে হবে। আমি এখানে কী-স্ট্রোকের জন্য প্রতিবেদনের প্রস্তাব দিচ্ছি ... :)
ম্যাট ব্যানার্ট

1
শালা @ ran2, তুমি আমার কাপুরুষোচিত, আঁকাবাঁকা নিতে পরিকল্পনা বানচাল করে থাকেন বিশ্বের , Mwahahahahaha !!!!
গ্যাভিন সিম্পসন

21

সুতরাং browser(), traceback()এবং debug()একটি বারে হাঁটুন, তবে trace()বাইরে অপেক্ষা করুন এবং মোটরটি চালিয়ে যান।

browserআপনার ফাংশনে কোথাও in োকানোর পরে , এক্সিকিউশনটি থামবে এবং আপনার ইনপুটটির জন্য অপেক্ষা করবে। আপনি 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

মার্ক ব্র্যাভিংটনের ডিবাগার যা সিআরএএন- debugতে প্যাকেজ হিসাবে পাওয়া যায় তা খুব ভাল এবং বেশ সোজা এগিয়ে forward

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

কোডটি হাইলাইটেড টক উইন্ডোতে পপ আপ হয় যাতে আপনি কী দেখতে পাচ্ছেন এবং অবশ্যই আপনি অন্যকে কল করতে পারেন mtrace() ফাংশনে থাকার সময় আপনি ।

আছে HTH


11

আমি গ্যাভিনের উত্তরটি পছন্দ করি: বিকল্পগুলি (ত্রুটি = পুনরুদ্ধার) সম্পর্কে আমি জানতাম না। আমি 'ডিবাগ' প্যাকেজটিও ব্যবহার করতে চাই যা আপনার কোডের মাধ্যমে পদক্ষেপের জন্য একটি ভিজ্যুয়াল উপায় দেয়।

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

এই মুহুর্তে এটি আপনার ফাংশনটি দেখায় একটি পৃথক ডিবাগ উইন্ডো খুলবে এবং হলুদ রেখার সাহায্যে আপনি কোডটিতে রয়েছেন। মূল উইন্ডোতে কোডটি ডিবাগ মোডে প্রবেশ করে, এবং আপনি কোডটি ধাপে প্রবেশের জন্য এন্টার চাপতে পারেন (এবং অন্যান্য কমান্ডগুলিও রয়েছে), এবং ভেরিয়েবল মানগুলি পরীক্ষা করে দেখতে পারেন the আপনি কোড হয়। ডিবাগিংয়ের মাধ্যমে হয়ে গেলে, আপনি এর মাধ্যমে ট্রেসিং বন্ধ করতে পারেন:

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

আমি আরও সাম্প্রতিক প্রশ্নের এই উত্তরটি দিয়েছি , তবে এটি এখানে সম্পূর্ণতার জন্য যুক্ত করছি।

ব্যক্তিগতভাবে আমি ডিবাগ করার জন্য ফাংশনগুলি ব্যবহার না করার ঝোঁক করি। আমি প্রায়শই দেখতে পাই যে এটি যতটা সমস্যার সমাধান করে তত সমস্যার সৃষ্টি করে। এছাড়াও, মতলব পটভূমি থেকে আসা কোডটিতে কোডটি না করে একীভূত বিকাশ পরিবেশে (আইডিই) এটি করতে সক্ষম হওয়া আমার পছন্দ। আইডিই ব্যবহার করা আপনার কোডটিকে পরিষ্কার এবং সরল রাখে।

আর এর জন্য, আমি "আরস্টুডিও" ( http://www.rstudio.com ) নামে একটি আইডিই ব্যবহার করি , যা উইন্ডোজ, ম্যাক এবং লিনাক্সের জন্য উপলব্ধ এবং এটি ব্যবহার করা বেশ সহজ।

প্রায় অক্টোবর ২০১৩ সাল থেকে Rstudio এর সংস্করণগুলিতে (0.98ish?) স্ক্রিপ্ট এবং ফাংশনগুলিতে ব্রেকপয়েন্ট যুক্ত করার ক্ষমতা রয়েছে: এটি করার জন্য, ব্রেকপয়েন্ট যুক্ত করতে কেবল ফাইলের বাম মার্জিনে ক্লিক করুন। আপনি একটি ব্রেকপয়েন্ট নির্ধারণ করতে পারেন এবং তারপরে সেই বিন্দু থেকে পদক্ষেপ নিতে পারেন। সেই পরিবেশের সমস্ত ডেটাতেও আপনার অ্যাক্সেস রয়েছে, যাতে আপনি আদেশগুলি চেষ্টা করে দেখতে পারেন।

বিশদ জানতে http://www.rstudio.com/ide/docs/debugging/overview দেখুন । আপনি যদি ইতিমধ্যে Rstudio ইনস্টল করেন তবে আপনাকে আপগ্রেড করতে হতে পারে - এটি তুলনামূলকভাবে নতুন (2013 সালের শেষের দিকে) বৈশিষ্ট্য।

অনুরূপ কার্যকারিতা রয়েছে এমন অন্যান্য IDE গুলিও আপনি খুঁজে পেতে পারেন।

স্বীকারোক্তিপূর্ণ, এটি যদি একটি অন্তর্নির্মিত ফাংশন হয় তবে আপনাকে এই আলোচনায় অন্যান্য ব্যক্তিদের দেওয়া কিছু পরামর্শ অবলম্বন করতে হতে পারে। তবে, যদি এটি আপনার নিজস্ব কোড যা ফিক্সিংয়ের প্রয়োজন হয় তবে একটি আইডিই-ভিত্তিক সমাধান আপনার প্রয়োজন মতো হতে পারে।


1

উদাহরণ উল্লেখ ছাড়াই রেফারেন্স ক্লাসের পদ্ধতিগুলি ডিবাগ করতে

ClassName$trace(methodName, browser)

0

আমি ভাবতে শুরু করি যে ত্রুটি লাইন নম্বরটি মুদ্রণ করা নয় - একটি সর্বাধিক মৌলিক প্রয়োজনীয়তা - ডিফিল্ট বাই- R / Rstudio এ এক ধরণের রসিকতা । ত্রুটিটি কোথায় ঘটেছে তা খুঁজে পাওয়ার জন্য কেবলমাত্র নির্ভরযোগ্য পদ্ধতিটি হ'ল ট্র্যাকব্যাক () চিহ্নিত করার অতিরিক্ত প্রচেষ্টা করা এবং শীর্ষ লাইনটি দেখা।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.