2010-10-11 16 views
45

आर में, मैं कैसे निर्धारित कर सकता हूं कि एक फ़ंक्शन कॉल चेतावनी में परिणाम देता है या नहीं?मैं कैसे जांच सकता हूं कि एक फ़ंक्शन कॉल चेतावनी में परिणाम देता है या नहीं?

यह है कि, फ़ंक्शन को कॉल करने के बाद मैं जानना चाहूंगा कि कॉल के उस उदाहरण ने चेतावनी दी है या नहीं।

+0

चेक कोशिश आप क्या चाहते हैं नहीं करता है। –

उत्तर

51

यदि आप try संरचनाओं का उपयोग करना चाहते हैं, तो आप चेतावनियों के लिए विकल्प सेट कर सकते हैं। ?options भी देखें।

x <- function(i){ 
    if (i < 10) warning("A warning") 
    i 
} 

tt <- tryCatch(x(5),error=function(e) e, warning=function(w) w) 

tt2 <- tryCatch(x(15),error=function(e) e, warning=function(w) w) 

tt 
## <simpleWarning in x(5): A warning> 

tt2 
## [1] 15 

if(is(tt,"warning")) print("KOOKOO") 
## [1] "KOOKOO" 

if(is(tt2,"warning")) print("KOOKOO") 

दोनों परिणाम और चेतावनी प्राप्त करने के लिए:: बेहतर tryCatch() उपयोग करने के लिए है

tryCatch(x(5),warning=function(w) return(list(x(5),w))) 

## [[1]] 
## [1] 5 
## 
## [[2]] 
## <simpleWarning in x(5): A warning> 

का उपयोग try

op <- options(warn=2) 

tt <- try(x()) 
ifelse(is(tt,"try-error"),"There was a warning or an error","OK") 
options(op) 
+3

आपके संपादन के लिए धन्यवाद कि परिणाम और चेतावनी दोनों कैसे प्राप्त करें; हालांकि, चेतावनी होने पर फ़ंक्शन को दो बार बुलाया जाता है। क्या यह केवल एक कॉल के साथ किया जा सकता है (यदि समारोह धीमा है, उदाहरण के लिए)? – Aaron

+0

@Aaron: तो मैं आपके द्वारा नीचे दिखाए गए हैंडलर के लिए जाऊंगा। यह सबसे साफ तरीका है, और उन्हें ऐसा करने के लिए बनाया जाता है। यह सिर्फ थोड़ा और परेशान करने की आवश्यकता है। –

+0

धन्यवाद। यह निश्चित रूप से परेशान है। हालांकि यह वही करता है जो मुझे चाहिए, उस कोड में बहुत कुछ है जिसे मैं अभी तक समझ नहीं पा रहा हूं। – Aaron

4

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

testit <- function() warning("testit") # function that generates warning. 

assign("last.warning", NULL, envir = baseenv()) # clear the previous warning 

testit() # run it 

if(length(warnings())>0){ # or !is.null(warnings()) 
    print("something happened") 
} 

शायद यह किसी भी तरह अप्रत्यक्ष है, लेकिन मैं और अधिक सरल रास्ता पता नहीं है।

+0

हालांकि यह सुरुचिपूर्ण है, यह अच्छा है क्योंकि मुझे चेतावनी पकड़ने का कोई अन्य तरीका नहीं मिल रहा है और फिर भी फ़ंक्शन से सामान्य परिणाम लौटाएं। यही है, अगर testit() एक मान देता है, tryExcept के साथ एक चेतावनी पकड़ने का मतलब है कि आप मूल्य खो देते हैं। जब तक मैं कुछ याद नहीं कर रहा हूँ? –

+1

@Alex: आप tryCatch सूत्र का उपयोग करके बहुत आसानी से कर सकते हैं। आप तर्क में चेतावनी के साथ कुछ कर सकते हैं, उदाहरण के लिए: चेतावनी = फ़ंक्शन (डब्ल्यू) {... कुछ करें ... वापसी (सामान्य परिणाम)} –

+0

@ जोरीस: मैं सामान्य परिणाम वापस करने के लिए प्रयास नहीं कर सका। क्या मैं कुछ भूल रहा हूँ? मुझे आर मेलिंग सूची (एक अलग उत्तर के रूप में शामिल) से, कॉलिंग हैंडलर के साथ उपयोग करने का एक तरीका मिला। – Aaron

18

आर मदद मेलिंग सूची पर (http://tolstoy.newcastle.edu.au/R/help/04/06/0217.html देखें), ल्यूक टियरनी ने लिखा:

"यदि आप एक फू लिखना चाहते हैं nction कि एक मूल्य की गणना करता है और चेतावनी आप इसे इस तरह से कर सकता सभी एकत्र करता है:? बाहर अगर

withWarnings <- function(expr) { 
    myWarnings <- NULL 
    wHandler <- function(w) { 
     myWarnings <<- c(myWarnings, list(w)) 
     invokeRestart("muffleWarning") 
    } 
    val <- withCallingHandlers(expr, warning = wHandler) 
    list(value = val, warnings = myWarnings) 
} 
+1

'<< -' सही है? – isomorphismes

+4

यूप, इस तरह यह फ़ंक्शन के बाहर 'myWarnings' को अपडेट करता है; अन्यथा यह फ़ंक्शन के अंदर एक नया 'myWarnings' बनाता है और बाहरी व्यक्ति अपडेट नहीं होता है। – Aaron

संबंधित मुद्दे

 संबंधित मुद्दे