什么时候使用warning(msg)?

时间:2019-04-16 13:26:00

标签: r

对于R具有warning(msg)的原因,我有些困惑。除了在warnings()中存储一些没人真正看过的消息外,似乎并没有真正导致代码执行过程中发生任何事情。

也许我用错了。也许我误会了它的目的。我使用的其他语言都没有警告异常,大多数只是一个异常(我猜这相当于R中的error(msg))。 warning(msg)是我只是忽略的异常,那么这有什么意义呢?

也许有人对您何时应该使用warning(msg)有很好的解释?或打算用于什么?

2 个答案:

答案 0 :(得分:3)

作为响应:似乎并没有真正导致代码执行过程中发生任何事情,只是将一些消息存储在没人真正看过的warnings()中,请尝试运行此命令:

 why_warning<-function(x){ 
    if(is.numeric(x)){ 
       warning("x must be a string")
    } 
    print(x)
 }

通过以下方式运行此

why_warning(2)

我们得到:

[1] 2
Warning message:
In why_warning(2) : x must be a string

简而言之,警告旨在确认存在问题,但已被“忽略”并返回了结果。这对于数值计算特别有用。

将此与以下功能进行比较:

why_warning<-function(x){
  stopifnot(is.character(x))

  print(x)
}

以上内容不会“返回”任何值,而是停止并引发错误:

Error in why_warning(2) : is.character(x) is not TRUE 

因此,根据功能的目标,警告可能仅仅是:警告。但是,这可能意味着人们获得的任何结果都是错误的。

您可以在warning下的?warning中找到更多详细信息。

答案 1 :(得分:3)

据我了解,warning()message()的替代品,不一定是stop()的替代品,这会导致错误。在警告中,通知用户某些事情与预期不符,但由用户自行决定问题是否严重以及是否要重写代码。

message()warning()之间的主要区别在于,警告消息将以Warning message:开头,并且R会跟踪是否发生后者。您还可以通过设置

自行选择是否希望代码完全停止任何警告
options(warn = 2)

我能想到的一种用法是警告用户,他/他正在使用的功能将很快被弃用。许多用户仍然会选择运行该代码,并在有空的时候对其进行修复。但是他们肯定知道现在将来会出现问题。

另一个用例是使用户知道内部已解决的问题。在这种情况下,如果修复不是他们要尝试的操作,则用户应该知道该功能的作用超出了用户的要求。来自dplyr的示例如下:

> a <- data.frame(x = c("p", "q", NA), y = c(1, 2, 3), stringsAsFactors = TRUE)
> b <- data.frame(x = c("p", "q", "r"), z = c(4, 5, 6), stringsAsFactors = TRUE)
> res <- inner_join(a, b, "x")
Warning message:
Column `x` joining factors with different levels, coercing to character vector 

这可能意味着存在严重问题,或者完全没有,这取决于您的用例。

如果您希望用户自己正确使用该功能,则可以选择停止该功能。实际上是some people advocate for that principle。我通常会尽量使我的软件包对用户尽可能友好,这样人们就不必为自己不理解的错误而苦恼。同时,我想告诉他们,如果不是他们打算这样做,他们可能犯了一个常见错误,可以选择修复它。