2

我想要一个函数,它针对特定的异常抛出并返回一条消息,然后简单地检查返回的内容是否是我定义的“异常”之一。例如说我有这个功能:

divideByX <- function(x){
    # If x is NA throws exception
    if(is.na(x)){
        return(exception('x is NA'))
    }
    # If x is 0 throws exception
    else if(x == 0){
        return(exception('Cannot divide by zero'))
    }
    else{
        return(10/x)
    }
}

因此,如果 x 为 0,则返回异常“不能除以零”,如果 x 为 NA,则返回异常“x 为 NA”,对于 x 的所有其他值,它会尝试计算表达式 10/x。

然后我想运行这样的东西:

tempList <- list('a' = 2, 'b' = 0, 'c' = 5, 'd' = NA)
lapply(tempList, function(x){
   if(is.exception(x)){
       return(x)
   }
   else{
       y <- divideByX(x)
       return(y^2)
   }
 })

所以它首先检查该值是否是我定义的异常之一,如果是则返回消息,否则它将我的值平方,所以上面应该返回

$a
[1] 25

$b
[1] 'Cannot divide by zero'

$c
[1] 4

$d
[1] 'x is NA'

有谁知道做到这一点的最佳方法?如果有任何不清楚的地方,请告诉我。

提前致谢

4

2 回答 2

2

创建一个函数来生成异常。异常可以是扩展简单错误类的线性层次结构

exception <-
    function(class, msg)
{
    cond <- simpleError(msg)
    class(cond) <- c(class, "MyException", class(cond))
    stop(cond)
}

这是你的功能

divideByX <- function(x){
    # If x is 0 throws exception
    if (length(x) != 1) {
        exception("NonScalar", "x is not length 1")
    } else if (is.na(x)) {
        exception("IsNA", "x is NA")
    } else if (x == 0) {
        exception("DivByZero", "divide by zero")
    }
    10 / x
}

并用于生成您要求的输出

lapply(tempList, function(x) tryCatch({
    divideByX(x)
}, MyException=function(err) {
    conditionMessage(err)
}))

或以不同的方式对待某些异常

> lapply(list(NA, 3:5), function(x) tryCatch({
+     divideByX(x)
+ }, IsNA=function(err) {
+     warning(err)  # signal a warning, return NA
+     NA
+ }, NonScalar=function(err) {
+     stop(err)     # fail
+ }))
Error: x is not length 1
In addition: Warning message:
x is NA 
于 2013-03-26T23:08:34.810 回答
-1

除非你总是除以 10,否则你会希望在 yoru 函数中包含分子。

    divideByX <- function(X, num=10) { 

    if(is.na(X)) 
        return('X is NA')
    if(X == 0) 
        return('Cannot divide by zero')

    return(num / X)
    }

用法:

y <- 3
lapply(tempList, divideByX, num=y^2)
#   $a
#   [1] 4.5
#   
#   $b
#   [1] "Cannot divide by zero"
#   
#   $c
#   [1] 1.8
#   
#   $d 
#   [1] "X is NA"
于 2013-03-26T19:08:19.513 回答