2016-03-08 68 views
1

我調用了其他的lib函數,它執行計算並拋出警告消息。我嘗試使用tryCatch()來捕獲消息,但不知道如何保留計算值和警告消息。這裏是示例(簡化)代碼,我希望mydiv函數具有計算值和警告消息。現在mydiv調用將返回除法值或警告,但不是兩者。R函數返回值以及警告消息

mydiv = function(x, y){ 
tryCatch({ 
# raise warning message 
if (x > y) 
    warning("throw a warning") 
    # function calc result 
    x/y 
}, 
warning = function(war) { 
flag = paste("DIV Warning:", war$message) 
return (flag) 
}, 
error = function(err) { 
flag = paste("DIV Err", err) 
return (flag) 
}) 
} 

如果我稱X = mydiv(2,1),然後x具有值 「DIV警告:拋出一個警告」;如果x = mydiv(2,4),則x:[1] 0.5。 所以我的問題是:1.使用tryCatch:如果可能的話如何返回計算的值和警告消息; 2.是否有更好的方法從函數中獲取兩個值。

回答

1

你可以使用內置的預警功能,如下:

mydiv = function(x, y){ 
    if (x > y) 
    warning("throw a warning") 
    # function calc result 
    return(x/y) 
} 

如果你想返回一個警告而不是發射它作爲一個警告信息,您可以返回命名列表,其中警告如果沒有警告產生,則列表中的條目將爲NA:

mydiv = function(x, y){ 
    warn <- NA 
    if (x > y) 
    warn <- "throw a warning" 
    # function calc result 
    return(list(value=x/y, warning=warn)) 
}