2010-10-26 10 views
8
op <- options(warn=0) #although doesn't work for any value of warn 
assign("last.warning", NULL, envir = baseenv()) 
thisDoesntWork<- function() { 
warning("HEY, this is definitely a warning!") 
cat(paste("number of warnings:",length(warnings()))) 
} 
>thisDoesntWork() 
Warning in thisDoesntWork() : HEY, this is definitely a warning! 
number of warnings: 0 

चेतावनी की संख्या 1 के बजाय 0 होना चाहिए - ऐसा लगता है कि warnings() रिटर्न कुछ भी नहीं करता है, तो एक समारोह के भीतर बुलाया। क्यूं कर? चेतावनियां होने पर फ़ंक्शन में जांचने के लिए कोई इसके आसपास कैसे काम कर सकता है, और उन्हें प्रिंट कर सकता है?चेतावनियां() फ़ंक्शन के भीतर काम नहीं करती हैं? इस के आसपास कोई कैसे काम कर सकता है?

मैं tryCatch का उपयोग नहीं करना चाहता, क्योंकि तब मैं उस मान को खो देता हूं जो फ़ंक्शन देता है (यह तब भी मान्य मान लौटा सकता है, भले ही यह चेतावनी उत्पन्न हो)।

उत्तर

5

है यहाँ के लिए suppressWarnings

function (expr) 
{ 
    withCallingHandlers(expr, warning = function(w) invokeRestart("muffleWarning")) 
} 

मैं इसे करने के लिए एक छोटे से बदलाव किया है कोड है इसके बजाय चेतावनियों की संख्या गिनें।

countWarnings <- function(expr) 
{ 
    .number_of_warnings <- 0L 
    frame_number <- sys.nframe() 
    ans <- withCallingHandlers(expr, warning = function(w) 
    { 
     assign(".number_of_warnings", .number_of_warnings + 1L, 
     envir = sys.frame(frame_number)) 
     invokeRestart("muffleWarning") 
    }) 
    message(paste("No. of warnings thrown:", .number_of_warnings)) 
    ans 
} 

एक परीक्षण:

countWarnings(log(-1)) 
No. of warnings thrown: 1 
[1] NaN 

एक अन्य परीक्षण:

foo <- function() 
{ 
    warning("first warning!") 
    warning("second warning!") 
    warning("third warning!") 
    invisible() 
} 
countWarnings(foo()) 
No. of warnings thrown: 3 
NULL 
+1

आप उत्तर की विशेषता के रूप में चेतावनियों की संख्या को वापस करने की कल्पना भी कर सकते हैं। 'attr (ans," number_of_warnings ") <- .number_of_warnings' –

+0

बढ़िया! मैं इस तरह से चेतावनी संदेश भी ले सकता हूं ('w') –

+1

आपका स्वागत है। कुछ भी नहीं कहता है कि आप एक उथल-पुथल की तरह धन्यवाद। :) –

2

आपका उदाहरण एक चेतावनी देता है।

> assign("last.warning", NULL, envir = baseenv()) 
> thisDoesntWork <- function() { 
+ warning("HEY, this is definitely a warning!") 
+ cat(paste("number of warnings:",length(warnings())),"\n") 
+ } 
> thisDoesntWork() 
number of warnings: 0 
Warning message: 
In thisDoesntWork() : HEY, this is definitely a warning! 
> warnings() # HEY, here's your warning!!! 
Warning message: 
In thisDoesntWork() : HEY, this is definitely a warning! 

प्रलेखन स्पष्ट नहीं है, लेकिन मुझे नहीं लगता कि last.warning कॉल खत्म (विशेष रूप से कॉल दिया क्या वापस किया जा सकता का हिस्सा है) जब तक सेट हो जाता है है।

+0

धन्यवाद, जैसा कि आप मेरा जहां इसे थूक से बाहर "चेतावनी की संख्या: 0" में देखते हैं उस पर काम नहीं करता है मेरी मशीन- आर 2.11.1 जीयूआई 1.34 तेंदुए के साथ ओएसएक्स 32-बिट (5589) का निर्माण। एचएम अब मुझे क्या करना चाहिए? –

+0

मेरा संपादन देखें (मैं 'last.warning' को साफ़ करना भूल गया था)। मुझे नहीं लगता कि इनमें से कोई भी मंच-विशिष्ट है। –

+0

यदि आप 'आखिरी। चेतावनी' के बारे में सही हैं, तो रिटर्न तक सेट नहीं किया जा रहा है, तो मैं अटक गया हूं। फ़ंक्शन के भीतर, मैं यह निर्धारित कैसे कर सकता हूं कि फ़ंक्शन द्वारा वापस किए जाने वाले मान को खोए बिना चेतावनी हुई है या नहीं? 'TryCatch' का उपयोग करना निश्चित रूप से चेतावनियों को पकड़ता है, लेकिन लगता है कि अगर' tryCatch' –

2

शायद यह एक बहुत ही बहुत बुरा समाधान नहीं है ...

fw<-function(){warning("warn...");return(99)} 
fn<-function(){return(88)} 

f<-function(){ 
    w<-0 
    v<-NULL 
    v<-tryCatch(fw(),warning=function(w){w}) 
    if("warning"%in%class(v)){ 
     w<-w+1 # e.g., count up the number of warning 
     v<-fw() 
    } 
    print(v) 

    v<-NULL 
    v<-tryCatch(fn(),warning=function(w){w}) 
    if("warning"%in%class(v)){ 
     w<-w+1 # e.g., count up the number of warning 
     v<-fn() 
    } 
    print(v) 
} 
f() 

समारोह दो बार बुला यदि चेतावनी होती है ... हालांकि मुझे विश्वास है कि वहाँ और अधिक सुरुचिपूर्ण समाधान

+0

हां मैंने अभी इस बारे में सोचना शुरू कर दिया है :) यह कोड और साथ ही सुरुचिपूर्ण –

0

चेतावनी है होना चाहिए फ़ंक्शन रिटर्न से पहले जारी नहीं किया गया। विकल्पों के लिए दस्तावेज़ देखें ("चेतावनी दी है"):

options(warn=1L) 
thisDoesntWork() 
#Warning in thisDoesntWork() : HEY, this is definitely a warning! 
#number of warnings: 1 
+0

का दर्द है, जवाब देने वाले पहले व्यक्ति की तरह, मुझे लगता है कि आप असाइन करने के लिए भूल गए हैं ("last.warning", NULL, envir = baseenv()) प्रथम।यदि ऐसा है, तो फ़ंक्शन पाता है कि 1 चेतावनी पिछले कॉल से है .. –

+0

ओह, अरे, यह सही है। वहां कुछ ख़राब चल रहा है। – VitoshKa

+0

यह मेरे लिए एक बग जैसा दिखता है। मैं आर-डेवेल पर इसकी रिपोर्ट करूंगा। – VitoshKa

1

यहाँ एक वैकल्पिक हल

..my_warning <- 0L 

thisDoesWork<- function(){ 
    assign("last.warning", NULL, envir = baseenv()) 
    warning("HEY, this is definitely a warning!", {..my_warning <<- ..my_warning+1L;""}) 
    str(last.warning) 
    cat(paste("number of warnings:", ..my_warning, "\n")) 
} 


thisDoesWork() 
Warning in thisDoesWork() : HEY, this is definitely a warning! 
NULL 
number of warnings: 1 
>  thisDoesWork() 
Warning in thisDoesWork() : HEY, this is definitely a warning! 
NULL 
number of warnings: 2 
>  thisDoesWork() 
Warning in thisDoesWork() : HEY, this is definitely a warning! 
NULL 
number of warnings: 3 
> 
+0

हां- एक कट्टरपंथी लेकिन ईमानदार होने के लिए, मैं '<< -' बहुत उपयोग करता हूं :) –

+1

विकल्प का उपयोग करने का एक और तरीका है। किसी भी मामले में "वैश्विकता" की आवश्यकता है। – VitoshKa

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