दिलचस्प पोस्ट
स्थानांतरित कंटेनर का पुन: उपयोग? Scala foreach अजीब व्यवहार यह समझना कि हथे को # कोण से निकालने के लिए क्या लेता है बंडलों का उपयोग करते हुए एंड्रॉइड गतिविधियों के बीच आप छवियों (बिटमैप) को कैसे पारित करते हैं? कुछ डेटा को दूसरे टुकड़ों में कैसे स्थानांतरित किया जाए? ह्यूवाइ फोन पर "संरक्षित ऐप्स" सेटिंग, और इसे कैसे प्रबंधित करें लिनक्स में पर्यावरण चर LD_LIBRARY_PATH कैसे सेट करें सीरियलज़ेबल का प्रयोग करते हुए आशय के माध्यम से डेटा पास करना वेबमेल के माध्यम से सी # में JSON को पोस्टिंग करना CSS विशेषता चयनकर्ता: उद्धरण चिह्नों पर नियम (", 'या कोई नहीं?) पायथन 3 आयात इरर: 'मॉड्यूल' नामक कोई मॉड्यूल 'कॉन्फ़िगरपर्स' Git में संशोधित (लेकिन प्रतिबद्ध नहीं) फ़ाइलों को अनदेखा करें? पूंजी पत्रों से पहले रिक्त स्थान जोड़ें मेरा परिवर्तन वापस क्यों बदलता है? रेल 3 में सत्र का समय समाप्त करना

फ़ंक्शन से आउटपुट के रूप में मैं चेतावनियों और त्रुटियों को कैसे बचा सकता हूं?

मैं बड़ी संख्या में वस्तुओं पर एक जटिल कार्य चलाने के लिए lapply का उपयोग कर रहा हूं, और मैं प्रत्येक आइटम (यदि कोई हो) से आउटपुट को किसी चेतावनी / त्रुटियों के साथ सहेजना चाहूंगा ताकि मैं यह बता सकूं कि कौन से वस्तु का उत्पादन जो चेतावनी / त्रुटि

मुझे withCallingHandlers चेतावनियों को पकड़ने का एक तरीका मिला (यहां बताया गया: https://stackoverflow.com/questions/4947528 )। हालांकि, मुझे त्रुटियों को भी पकड़ना होगा मैं इसे tryCatch (नीचे दिए गए कोड के रूप में) में लपेटकर कर सकता हूं, लेकिन क्या यह करने का एक बेहतर तरीका है?

 catchToList <- function(expr) { val <- NULL myWarnings <- NULL wHandler <- function(w) { myWarnings <<- c(myWarnings, w$message) invokeRestart("muffleWarning") } myError <- NULL eHandler <- function(e) { myError <<- e$message NULL } val <- tryCatch(withCallingHandlers(expr, warning = wHandler), error = eHandler) list(value = val, warnings = myWarnings, error=myError) } 

इस फ़ंक्शन का नमूना आउटपुट है:

 > catchToList({warning("warning 1");warning("warning 2");1}) $value [1] 1 $warnings [1] "warning 1" "warning 2" $error NULL > catchToList({warning("my warning");stop("my error")}) $value NULL $warnings [1] "my warning" $error [1] "my error" 

यहां पर कई सवाल हैं, ताकि चर्चा करने की tryCatch , tryCatch और त्रुटि से निपटने, लेकिन कोई ऐसा नहीं जो मुझे पता चला कि यह विशेष मुद्दा। देखें कि मैं एक फ़ंक्शन कॉल परिणामों की चेतावनी में कैसे जांच सकता हूं? , चेतावनियाँ () किसी फ़ंक्शन के भीतर काम नहीं करती हैं? यह कैसे काम कर सकता है? , और एक त्रुटि की अनदेखी करने के लिए और सूची में अगली बात को संसाधित करने के लिए लापरवाही कैसे बताएं? सबसे प्रासंगिक लोगों के लिए

वेब के समाधान से एकत्रित समाधान "फ़ंक्शन से आउटपुट के रूप में मैं चेतावनियों और त्रुटियों को कैसे बचा सकता हूं?"

हो सकता है कि यह आपके समाधान के समान है, लेकिन मैंने सादे पुराने फ़ंक्शंस को फ़ंक्शन में कनवर्ट करने के लिए एक factory लिखा, जो उनके मूल्यों, त्रुटियों और चेतावनियों को कैप्चर करते हैं, इसलिए मैं कर सकता हूं

 test <- function(i) switch(i, "1"=stop("oops"), "2"={ warning("hmm"); i }, i) res <- lapply(1:3, factory(test)) 

मूल्य, त्रुटि, और / या चेतावनी वाले परिणाम के प्रत्येक तत्व के साथ यह उपयोगकर्ता फ़ंक्शंस, सिस्टम फ़ंक्शंस या अनाम फ़ंक्शंस ( factory(function(i) ...) साथ काम करेगा factory(function(i) ...) )। यहाँ कारखाना है

 factory <- function(fun) function(...) { warn <- err <- NULL res <- withCallingHandlers( tryCatch(fun(...), error=function(e) { err <<- conditionMessage(e) NULL }), warning=function(w) { warn <<- append(warn, conditionMessage(w)) invokeRestart("muffleWarning") }) list(res, warn=warn, err=err) } 

और परिणाम सूची से निपटने के लिए कुछ सहायक

 .has <- function(x, what) !sapply(lapply(x, "[[", what), is.null) hasWarning <- function(x) .has(x, "warn") hasError <- function(x) .has(x, "err") isClean <- function(x) !(hasError(x) | hasWarning(x)) value <- function(x) sapply(x, "[[", 1) cleanv <- function(x) sapply(x[isClean(x)], "[[", 1) 

पैकेज का मूल्यांकन करें।

 library(evaluate) test <- function(i) switch(i, "1"=stop("oops"), "2"={ warning("hmm"); i }, i) t1 <- evaluate("test(1)") t2 <- evaluate("test(2)") t3 <- evaluate("test(3)") 

इसमें वर्तमान में अभिव्यक्ति का मूल्यांकन करने का एक अच्छा तरीका नहीं है – यह मुख्य रूप से है क्योंकि कंसोल में आर आउटपुट के दिए गए पाठ इनपुट को प्रतिलिपि बनाने के लिए लक्ष्यीकरण किया गया है।

 replay(t1) replay(t2) replay(t3) 

यह कंसोल के लिए संदेश, आउटपुट को भी कैप्चर करता है, और यह सुनिश्चित करता है कि जिस क्रम में यह हुआ, उसमें सबकुछ सही ढंग से हस्तलिखित हो।

मैंने मार्टिंस सॉल्युशन ( https://stackoverflow.com/a/4952908/2161065 ) को मिला दिया है और आर-हेल्प मेलिंग लिस्ट में से एक जो आपको demo(error.catching) साथ मिलता है demo(error.catching)

मुख्य विचार यह है कि दोनों को चेतावनी / त्रुटि संदेश के साथ ही इस समस्या को ट्रिगर करने वाला आदेश रखना है।

 myTryCatch <- function(expr) { warn <- err <- NULL value <- withCallingHandlers( tryCatch(expr, error=function(e) { err <<- e NULL }), warning=function(w) { warn <<- w invokeRestart("muffleWarning") }) list(value=value, warning=warn, error=err) } 

उदाहरण:

 myTryCatch(log(1)) myTryCatch(log(-1)) myTryCatch(log("a")) 

आउटपुट:

> myTryCatch (लॉग (1))

$ मान [1] 0 $ चेतावनी NULL $ त्रुटि शून्य

> myTryCatch (लॉग (-1))

$ मान [1] एनएएन $ चेतावनी $ त्रुटि शून्य

> myTryCatch (लॉग ("a"))

$ मूल्य NULL $ चेतावनी नल $ त्रुटि

मेरे जवाब (और मार्टिन के उत्कृष्ट कोड में संशोधन) का उद्देश्य है कि कारखाना-एडी समारोह डेटा संरचना की उम्मीद करता है अगर सब ठीक हो जाए तो यदि चेतावनी का अनुभव होता है, तो यह factory-warning विशेषता के तहत परिणाम से जुड़ा हुआ है। data.table के setattr फ़ंक्शन का उपयोग उस पैकेज के साथ संगतता के लिए करने के लिए किया जाता है। यदि त्रुटि का अनुभव होता है, तो परिणाम यह है कि "फ़ैक्टरी फ़ंक्शन में कोई त्रुटि हुई" चरित्र तत्व और factory-error विशेषता में त्रुटि संदेश होगा।

 #' Catch errors and warnings and store them for subsequent evaluation #' #' Factory modified from a version written by Martin Morgan on Stack Overflow (see below). #' Factory generates a function which is appropriately wrapped by error handlers. #' If there are no errors and no warnings, the result is provided. #' If there are warnings but no errors, the result is provided with a warn attribute set. #' If there are errors, the result retutrns is a list with the elements of warn and err. #' This is a nice way to recover from a problems that may have occurred during loop evaluation or during cluster usage. #' Check the references for additional related functions. #' I have not included the other factory functions included in the original Stack Overflow answer because they did not play well with the return item as an S4 object. #' @export #' @param fun The function to be turned into a factory #' @return The result of the function given to turn into a factory. If this function was in error "An error as occurred" as a character element. factory-error and factory-warning attributes may also be set as appropriate. #' @references #' \url{http://stackoverflow.com/questions/4948361/how-do-i-save-warnings-and-errors-as-output-from-a-function} #' @author Martin Morgan; Modified by Russell S. Pierce #' @examples #' f.log <- factory(log) #' f.log("a") #' f.as.numeric <- factory(as.numeric) #' f.as.numeric(c("a","b",1)) factory <- function (fun) { errorOccurred <- FALSE library(data.table) function(...) { warn <- err <- NULL res <- withCallingHandlers(tryCatch(fun(...), error = function(e) { err <<- conditionMessage(e) errorOccurred <<- TRUE NULL }), warning = function(w) { warn <<- append(warn, conditionMessage(w)) invokeRestart("muffleWarning") }) if (errorOccurred) { res <- "An error occurred in the factory function" } if (is.character(warn)) { data.table::setattr(res,"factory-warning",warn) } else { data.table::setattr(res,"factory-warning",NULL) } if (is.character(err)) { data.table::setattr(res,"factory-error",err) } else { data.table::setattr(res, "factory-error", NULL) } return(res) } } 

चूंकि हम परिणाम को एक अतिरिक्त सूची में लपेट नहीं करते हैं, इसलिए हम उन धारणाओं को नहीं बना सकते हैं जो उनके एक्सेसर फ़ंक्शंस में से कुछ की अनुमति देते हैं, लेकिन हम सरल जांच लिख सकते हैं और निर्णय ले सकते हैं कि मामलों को कैसे निपटाना है, जो हमारे विशेष परिणाम के लिए उपयुक्त है डेटा संरचना।

 .has <- function(x, what) { !is.null(attr(x,what)) } hasWarning <- function(x) .has(x, "factory-warning") hasError <- function(x) .has(x, "factory-error") isClean <- function(x) !(hasError(x) | hasWarning(x))