2014-06-19 34 views
1

錯誤我試圖寫在R使用tryCatch錯誤異常處理。tryCatch結果在相同的輸出,無論在R

correct = 1 
tryCatch({ 
    sqrt(b) 

    }, 
    warning = function(w){ 
     print("NaNs") 
    }, 
    finally = { 
     correct = 0 
    } 
) 
correct 

如果設置B = -5,警告被打印和正確的值是0。如果設置了B = 5,警告不打印。但是,值仍然是0.我想要的是,當有一些警告/錯誤需要捕捉時,正確值爲0.當沒有警告/錯誤時,正確值爲1.謝謝!

回答

2

您不希望finally在這裏。相反,只要在發生錯誤或警告時指定返回值0即可。

myfun <- function(b) { 
    tryCatch({ 
     sqrt(b) 
    }, 
    error = function(e){ 
     return(0) 
    }, 
    warning = function(w){ 
     return(0) 
    } 
    ) 
} 

> myfun(5) 
# [1] 2.236068 
> myfun(-5) 
# [1] 0 
1

這裏是一個函數:

is.bad <- function(x) { 
    as.numeric(isTRUE(tryCatch(x, 
     error = function(c) TRUE, 
     warning = function(c) TRUE 
    ))) 
} 

is.bad(stop()) 
is.bad(warning()) 
is.bad(message()) 
is.bad(3) 

## > is.bad(stop()) 
## [1] 1 
## > is.bad(warning()) 
## [1] 1 
## > is.bad(message()) 
## 
## [1] 0 
## > is.bad(3) 
## [1] 0 
1

finally子句不管警告是否被在平方根拋出執行。這就是爲什麼你最終與correct == 0無論如何。

下面的代碼會做你想做的事情,雖然我使用了一個全局任務<<-,如果你不小心,可能會導致問題。這是必要的,否則您不能在warning函數內更改correct的值。

correct = 1 
tryCatch({ 
    sqrt(b)  
}, 
warning = function(w){ 
    print("NaNs") 
    correct <<- 0 
} 
)