मैं बड़ी संख्या में आइटम पर एक जटिल फ़ंक्शन चलाने के लिए 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
और त्रुटि हैंडलिंग, लेकिन कोई भी है कि मुझे लगता है कि पता इस विशेष मुद्दे पाया। सबसे प्रासंगिक लोगों के लिए How can I check whether a function call results in a warning?, warnings() does not work within a function? How can one work around this?, और How to tell lapply to ignore an error and process the next thing in the list? देखें।
हाँ, वही विचार, लेकिन बहुत अच्छा! क्या आपने इसे पैकेज में लपेटने पर विचार किया है? अन्य प्रश्नों से मैंने यहां कुछ अन्य लोगों को यह भी उपयोगी पाया होगा। – Aaron
मेरे पास एक ऐसा फ़ंक्शन है जो आउटपुट में अपना कॉल संग्रहीत करता है। 'फैक्ट्री' का आह्वान करने के बाद यह कॉल बदल गया है, उदा। 'मजेदार (सूत्र = ..1, डेटा = ..2, विधि =" अनुवांशिक ", अनुपात = ..4, print.level = 0) ', जहां' सूत्र 'मेरा मूल इनपुट सूत्र होना चाहिए, लेकिन ओवरराइट हो जाता है । कोई सुझाव? –
@ रोमन लूस्ट्रिक: मुझे लगता है कि ऐसा इसलिए है क्योंकि यह वास्तव में एक नया फ़ंक्शन 'मजेदार' बना रहा है और उसे सीधे कॉल करने के बजाय '...' के साथ कॉल कर रहा है। मुझे आश्चर्य है कि मेरा 'कैच टॉलीस्ट' फ़ंक्शन काम करता है, या यदि 'फैक्ट्री' को संशोधित किया जा सकता है, तो शायद 'do.call' का उपयोग कर। इसे पुन: उत्पन्न कैसे किया जा सकता है? – Aaron