警告和消息有什么区别?

Joh*_*ohn 2 unit-testing r try-catch

我已阅读http://adv-r.had.co.nz/Exceptions-Debugging.html,我所理解的是我们有三种主要类型的条件(我将其称为错误):

  • 错误
  • 警告
  • 信息

据我了解,错误是非常不合适的事情,它可能对我们的功能非常有害(最严重的错误类型)。但我无法区分警告和消息。我想说的是,一条消息共享有关我们代码中某些可能存在的错误部分的附加信息,但这不会直接影响我们的代码(这意味着我们的代码可以工作,但有一些我们应该注意的附加信息)。

  • 警告和按摩到底有什么区别?
  • 我是否正确理解错误的含义?

All*_*ron 7

首先,您应该清楚“错误”的含义。错误只是代码的一部分,它没有按照您预期的方式运行。您的代码可能有错误,但不会给出任何错误、警告或消息。例如,下面的函数有一个明显的bug:

add_two_numbers <- function(a, b)
{
  return(a - b);
}

add_two_numbers(2, 2)
#> [1] 0
Run Code Online (Sandbox Code Playgroud)

哎呀!我希望它添加数字,但我的函数却减去它们。这是一个bug,如果我在这个阶段没有发现它,那么以后依靠它进行计算可能会遇到麻烦。

错误、警告和消息不是错误。他们是故意的。它们由函数或包的作者设置,以确保软件按预期完成其工作,并在用户尝试执行软件无意执行或无法执行的操作时向用户发出警报。

当函数必须停止计算并中止时,通常会使用错误。这在测试函数的输入时非常有用:

add_two_numbers <- function(a, b) {
  if(!is.numeric(a)) stop(paste(a, "is not a number"))
  if(!is.numeric(b)) stop(paste(b, "is not a number"))
  
  return(a + b)
}

add_two_numbers("hello", 2)
#> Error in add_two_numbers("hello", 2): hello is not a number

add_two_numbers(2, "world")
#> Error in add_two_numbers(2, "world"): world is not a number

add_two_numbers(2, 2)
#> [1] 4
Run Code Online (Sandbox Code Playgroud)

您会注意到,对该函数的前两次调用没有返回任何内容 - 它们只是发出错误并停止。

我们想要这样做的原因可能是尝试为用户提供一些有用的指导。例如,如果我们有:

add_two_numbers <- function(a, b) a + b
Run Code Online (Sandbox Code Playgroud)

然后,当我们尝试传递错误的参数类型时,我们会得到:

add_two_numbers("hello", 2)
#> Error in a + b : non-numeric argument to binary operator
Run Code Online (Sandbox Code Playgroud)

这个错误是由 R 解析器抛出的,与我们的具体消息相比有点模糊。当我们编写自己的错误消息时,我们试图预测何时会发生更根本的错误并阻止它,以防止它发生并向我们的用户提供有用的信息。

同样,我们可以写一条警告信息。当我们想让用户意识到某些可能会产生意外结果的事情时,通常会使用它。例如:

add_two_numbers("hello", 2)
#> Error in a + b : non-numeric argument to binary operator
Run Code Online (Sandbox Code Playgroud)

我们是否希望将空白区域转换为NA,或者空白区域是否是数据输入错误?两者都可能为真,因此该函数会继续处理数据并给出输出,但会警告您这可能不是您所期望的。

如果我们想要一个发出警告的函数,很容易编写一个:

as.numeric(c("1", "2", "3", " "))
#> [1]  1  2  3 NA
#> Warning message:
#> NAs introduced by coercion
Run Code Online (Sandbox Code Playgroud)

所以我们的函数仍然返回一个答案,但每当我们使用它时它都会给我们一个显着的警告。

最后,消息只是给用户的消息,不构成函数输出的一部分,也不一定是坏消息,但向控制台写入一条可能是有用信息的消息。

pointless <- function() {
  warning("This function is pointless")
  return(1)
}

pointless()
#> [1] 1
#> Warning message:
#> In pointless() : This function is pointless
Run Code Online (Sandbox Code Playgroud)