2010-10-26 61 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' – 2010-10-26 10:49:15

+0

太好了!我也可以用這種方式抓住警告信息('w') – 2010-10-27 04:42:40

+1

不客氣。沒有什麼表示感謝你喜歡upvote。 :) – 2010-10-27 07:45:21

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」 看它不工作的我的機器OSX R 2.11.1 GUI 1.34 Leopard構建32位(5589)。嗯現在我應該嘗試什麼? – 2010-10-26 02:38:56

+0

看我的編輯(我忘了清除'last.warning')。我不認爲這是針對特定平臺的。 – 2010-10-26 02:41:47

+0

如果你認爲'last.warning'沒有被設置,直到返回,然後我卡住了。在函數中,如何確定是否發生警告,而不會丟失函數要返回的值?使用'tryCatch'當然會捕獲警告,但是如果沒有嵌入'tryCatch',函數將會返回該值的值。 – 2010-10-26 02:56:44

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

是的,我剛開始考慮這個:)我的代碼和代碼都很痛苦 – 2010-10-26 06:51:19

0

的警告是不在函數返回之前發出。 見選項的文檔( 「警告」):

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

就像第一個回答的人,我想你可能忘記調用assign(「last.warning」,NULL,envir = baseenv ())。如果是這樣,該函數發現的1個警告來自先前的呼叫。 – 2010-10-26 08:35:11

+0

哦,該死的,沒錯。在那裏發生一些可疑的事情。 – VitoshKa 2010-10-26 09:31:53

+0

這看起來像是一個bug。我會在r-devel上報告它。 – VitoshKa 2010-10-26 09:42:00

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

是的,但是,說實話,我用'<< - '很多:) – 2010-10-26 09:50:40

+1

另一種方法是使用選項。在任何情況下,某種 「全球性」是需要的。 – VitoshKa 2010-10-26 10:01:51

相關問題