त्रुटि के बारे में जानकारी बनाए रखने और विफलता के बाद इस जानकारी की जांच करने के लिए एक अनुकूलित वर्कफ़्लो के साथ, गैर-विपत्तिपूर्ण त्रुटियों से निपटने के लिए वैश्विक आर विकल्प को निर्दिष्ट करना। मैं वर्तमान में R संस्करण 3.4.1 चला रहा हूं। नीचे, मैंने उन वर्कफ़्लो का विवरण शामिल किया है जो मेरे लिए काम करते थे, साथ ही कुछ कोड जो मैंने आर में वैश्विक त्रुटि हैंडलिंग विकल्प सेट करने के लिए उपयोग किया था।
जैसा कि मैंने इसे कॉन्फ़िगर किया है, त्रुटि हैंडलिंग भी त्रुटि के समय काम करने वाली मेमोरी में सभी वस्तुओं से युक्त एक RData फ़ाइल बनाता है। इस डंप को R उपयोग में वापस पढ़ा जा सकता है load()और फिर विभिन्न वातावरण के रूप में वे त्रुटि के समय मौजूद थे, का उपयोग करके अंतःक्रियात्मक रूप से निरीक्षण किया जा सकता है debugger(errorDump)।
मैं ध्यान दूंगा कि मैं traceback()स्टैक के भीतर किसी भी कस्टम फ़ंक्शन से आउटपुट में लाइन नंबर प्राप्त करने में सक्षम था , लेकिन केवल तभी जब मैंने अपनी स्क्रिप्ट में उपयोग किए गए किसी भी कस्टम फ़ंक्शन के लिए keep.source=TRUEकॉल source()करते समय विकल्प का उपयोग किया था। इस विकल्प के बिना, नीचे दिए गए traceback()त्रुटि लॉग के पूर्ण आउटपुट के रूप में वैश्विक त्रुटि से निपटने के विकल्प को सेट करना error.log, लेकिन लाइन नंबर उपलब्ध नहीं थे।
यहां मैंने अपने वर्कफ़्लो में सामान्य कदम उठाए हैं और मैं एक गैर-इंटरैक्टिव आर विफलता के बाद मेमोरी डंप और त्रुटि लॉग तक कैसे पहुंच सकता हूं।
मैंने मुख्य स्क्रिप्ट को कमांड लाइन से कॉल कर रहा था, उसके शीर्ष पर निम्नलिखित रखा। यह R सत्र के लिए वैश्विक त्रुटि हैंडलिंग विकल्प सेट करता है। मेरी मुख्य स्क्रिप्ट को बुलाया गया था myMainScript.R। कोड की विभिन्न पंक्तियों में उनके द्वारा की गई टिप्पणियों का वर्णन है कि वे क्या करते हैं। मूल रूप से, इस विकल्प के साथ, जब आर एक त्रुटि का सामना करता है जो ट्रिगर करता है stop(), तो यह निर्देशिका में सभी सक्रिय वातावरणों में कार्यशील मेमोरी का एक आरडीएटा (* .rda) डंप फ़ाइल बनाएगा ~/myUsername/directoryForDumpऔर error.logकुछ उपयोगी जानकारी के साथ नाम त्रुटि लॉग भी लिखेगा । एक ही निर्देशिका। आप त्रुटि पर अन्य हैंडलिंग जोड़ने के लिए इस स्निपेट को संशोधित कर सकते हैं (जैसे, डंप फ़ाइल में एक टाइमस्टैम्प जोड़ें और त्रुटि लॉग फ़ाइलनाम, आदि)।
options(error = quote({
setwd('~/myUsername/directoryForDump'); # Set working directory where you want the dump to go, since dump.frames() doesn't seem to accept absolute file paths.
dump.frames("errorDump", to.file=TRUE, include.GlobalEnv=TRUE); # First dump to file; this dump is not accessible by the R session.
sink(file="error.log"); # Specify sink file to redirect all output.
dump.frames(); # Dump again to be able to retrieve error message and write to error log; this dump is accessible by the R session since not dumped to file.
cat(attr(last.dump,"error.message")); # Print error message to file, along with simplified stack trace.
cat('\nTraceback:');
cat('\n');
traceback(2); # Print full traceback of function calls with all parameters. The 2 passed to traceback omits the outermost two function calls.
sink();
q()}))
सुनिश्चित करें कि मुख्य स्क्रिप्ट और किसी भी बाद के फ़ंक्शन कॉल से, कभी भी किसी फ़ंक्शन को खट्टा keep.source=TRUEकिया जाता है , विकल्प का उपयोग किया जाता है। यही है, एक समारोह के स्रोत के लिए, आप उपयोग करेंगे source('~/path/to/myFunction.R', keep.source=TRUE)। traceback()आउटपुट के लिए लाइन नंबरों को शामिल करना आवश्यक है । ऐसा लगता है कि आप इस विकल्प को विश्व स्तर पर उपयोग करने में सक्षम हो सकते हैं options( keep.source=TRUE ), लेकिन मैंने यह देखने के लिए यह परीक्षण नहीं किया है कि यह काम करता है या नहीं। यदि आपको पंक्ति संख्याओं की आवश्यकता नहीं है, तो आप इस विकल्प को छोड़ सकते हैं।
- टर्मिनल (आर के बाहर) से, मुख्य स्क्रिप्ट को बैच मोड में उपयोग करके कॉल करें
Rscript myMainScript.R। यह एक नया गैर-इंटरैक्टिव आर सत्र शुरू करता है और स्क्रिप्ट चलाता है myMainScript.R। चरण 1 में दिए गए कोड स्निपेट को myMainScript.Rसेट किया गया है जो गैर-इंटरैक्टिव आर सत्र के लिए त्रुटि हैंडलिंग विकल्प सेट करता है।
- के निष्पादन के भीतर कहीं त्रुटि का सामना करना
myMainScript.R। यह मुख्य लिपि में ही हो सकता है, या कई कार्यों को गहनता से निहित कर सकता है। जब त्रुटि का सामना करना पड़ता है, तो चरण 1 में निर्दिष्ट अनुसार हैंडलिंग का प्रदर्शन किया जाएगा, और आर सत्र समाप्त हो जाएगा।
- RDD डंप फ़ाइल नाम
errorDump.rdaऔर त्रुटि लॉग नाम वैश्विक त्रुटि हैंडलिंग विकल्प सेटिंग error.logद्वारा निर्दिष्ट निर्देशिका में बनाई गई हैं '~/myUsername/directoryForDump'।
अपने अवकाश पर, error.logत्रुटि के बारे में जानकारी की समीक्षा करने के लिए निरीक्षण करें, जिसमें त्रुटि संदेश स्वयं और पूर्ण स्टैक ट्रेस त्रुटि के लिए अग्रणी है। यहां उस लॉग का एक उदाहरण है जो त्रुटि पर उत्पन्न होता है; #वर्ण के बाद संख्याओं पर ध्यान दें कि कॉल स्टैक में विभिन्न बिंदुओं पर त्रुटि की रेखा संख्याएं हैं:
Error in callNonExistFunc() : could not find function "callNonExistFunc"
Calls: test_multi_commodity_flow_cmd -> getExtendedConfigDF -> extendConfigDF
Traceback:
3: extendConfigDF(info_df, data_dir = user_dir, dlevel = dlevel) at test_multi_commodity_flow.R#304
2: getExtendedConfigDF(config_file_path, out_dir, dlevel) at test_multi_commodity_flow.R#352
1: test_multi_commodity_flow_cmd(config_file_path = config_file_path,
spot_file_path = spot_file_path, forward_file_path = forward_file_path,
data_dir = "../", user_dir = "Output", sim_type = "spot",
sim_scheme = "shape", sim_gran = "hourly", sim_adjust = "raw",
nsim = 5, start_date = "2017-07-01", end_date = "2017-12-31",
compute_averages = opt$compute_averages, compute_shapes = opt$compute_shapes,
overwrite = opt$overwrite, nmonths = opt$nmonths, forward_regime = opt$fregime,
ltfv_ratio = opt$ltfv_ratio, method = opt$method, dlevel = 0)
अपने अवकाश पर, आप errorDump.rdaएक इंटरैक्टिव R सत्र का उपयोग करके लोड कर सकते हैं load('~/path/to/errorDump.rda')। एक बार लोड होने पर, debugger(errorDump)किसी भी सक्रिय वातावरण में मेमोरी में सभी आर ऑब्जेक्ट्स ब्राउज़ करने के लिए कॉल करें। debugger()अधिक जानकारी के लिए R मदद देखें ।
कुछ प्रकार के उत्पादन वातावरण में R को चलाने पर यह वर्कफ़्लो काफी सहायक होता है, जहाँ आपके पास कमांड लाइन पर गैर-संवादात्मक R सत्र आरंभ हो रहे हैं और आप अनपेक्षित त्रुटियों के बारे में जानकारी बरकरार रखना चाहते हैं। किसी फ़ाइल में मेमोरी को डंप करने की क्षमता, आप कॉल स्टैक में त्रुटि की लाइन संख्या होने के साथ-साथ त्रुटि के समय काम करने वाली मेमोरी का निरीक्षण करने के लिए उपयोग कर सकते हैं, जो त्रुटि का कारण पोस्टमार्टम डिबगिंग की सुविधा प्रदान करता है।