如何在R中编写你的第一个tryCatch()函数

1,082 阅读1分钟

你可以在R中使用tryCatch()函数来返回一些表达式的值,或者在遇到警告或错误时产生一个自定义信息。

这个函数使用以下基本语法:

my_function <- function(x, y){
    tryCatch(
        #try to do this
        {
        #some expression
        },
        #if an error occurs, tell me the error
        error=function(e) {
            message('An Error Occurred')
            print(e)
        },
        #if a warning occurs, tell me the warning
        warning=function(w) {
            message('A Warning Occurred')
            print(w)
            return(NA)
        }
    )
}

下面的例子展示了如何在实践中使用tryCatch()函数。

例子:在R中创建一个tryCatch()函数

假设我们创建了下面这个tryCatch()函数,试图取一个值的对数,然后除以第二个值。

如果发生错误,我们将产生 "发生错误 "的消息,然后在R中打印错误。

如果发生警告,我们将产生 "发生警告 "的消息,在R中打印警告,然后返回一个NA值。

如果既没有发生错误也没有发生警告,我们将简单地返回函数的结果:

log_and_divide <- function(x, y){
    tryCatch(
        {
        result = log(x) / y
        return(result)
        },
        error=function(e) {
            message('An Error Occurred')
            print(e)
        },
        warning=function(w) {
            message('A Warning Occurred')
            print(w)
            return(NA)
        }
    )
}

让我们在不同的场景下运行这个函数。

情景1:没有错误或警告发生

下面的代码显示了如何在没有错误或警告发生的情况下使用该函数:

#run function
log_and_divide(10, 2)

[1] 1.151293

由于没有发生错误或警告,该函数只是返回表达式的结果,结果是1.151293

情景2:发生错误

下面的代码显示了在发生错误的情况下如何使用该函数:

#run function
log_and_divide(10)

An Error Occurred
<simpleError in doTryCatch(return(expr), name, parentenv, handler):
  argument "y" is missing, with no default>

由于我们只向函数提供了一个参数,我们收到了 "发生错误"的信息,我们还看到了R产生的确切错误。

情景3:发生警告

下面的代码显示了在发生警告的情况下如何使用该函数:

#run function
log_and_divide(-10, 2)

A Warning Occurred
<simpleWarning in log(x): NaNs produced>
[1] NA

由于我们为第一个参数提供了一个负值,R无法计算负值的对数,所以我们收到了 "发生了警告"的消息,我们看到了R产生的确切警告,并且函数的结果是NA

其他资源

下面的教程解释了如何在R中执行其他常见的操作:

如何在R中创建一个嵌套的For循环
如何在R中使用循环向向量追加数值
如何在R中从函数中返回值