如何在R中创建try-error类

时间:2016-12-27 23:55:58

标签: r try-catch

我需要返回"尝试错误"继承自它的类或同一个类。是否有可能在R?

那么,是否可以创建这样的函数:

Foo <- function(x)
{
    if (x != 2) { res <- 1 }
    else { res <- # create object with class type "try-error" and message "I hate 2!"/ }

    return(res);
}

2 个答案:

答案 0 :(得分:4)

在R中,类是一个非常宽松的概念;您可以在对象的class属性中将所需的任何类指定为字符串。例如,使用structure函数:

Foo <- function(x) {
    if (x != 2) {
        res <- 1
    } else { 
        res <- structure(
            "message", 
            class = c("try-error", "character")
        )
    }
    res
}

Foo(1)
# [1] 1

Foo(2)
# [1] "message"
# attr(,"class")
# [1] "try-error" "character"

class(Foo(2))
# [1] "try-error" "character"

或者,您可以使用

res <- "message"
class(res) <- c("try-error", class(res))

取代structure

添加新类通常是一个好主意,而不是完全覆盖旧类,以便方法调度合理地工作,但根据您的使用情况,这可能不需要或不需要。

答案 1 :(得分:1)

为什么不使用try

Foo <- function(x)
{ res <- try({
    if (x == 2L) stop("I hate 2!", call. = FALSE)
    1
  }) 
  res
}

Foo(2)
#Error : I hate 2!
#[1] "Error : I hate 2!\n"
#attr(,"class")
#[1] "try-error"
#attr(,"condition")
#<simpleError: I hate 2!>

我无法找到一个很好的理由,为什么你要创建一个类的对象&#34;尝试错误&#34;手动