R的良好编码规范:message/cat/print/warning/error?

4

关于R包开发,当函数应该返回错误信息或警告时,最好使用哪种方法?:

  • cat()
  • print()
  • message()
  • error()
  • warning()

例如,在这个函数中,如果a或b不是数字,应该使用哪一个来返回错误信息。

function_sum_two_nums <- function(a, b){

    ## Check if the a and b are numbers

    if(is.numeric(a) & is.numeric(b)){
        return(a+b)
    } else{
        print/cat/message/error/warning('a or b are not numbers')
    }
}

1
根据 https://dev59.com/SsHqa4cB1Zd3GeqP5bRB#68712477,您可能是想使用 stop 而不是 error - shadowtalker
2个回答

3

您的例子

在这种情况下,唯一明智的选择是使用stop(),因为这种情况是错误的,并且当遇到错误时,您希望停止函数继续执行

其他选项将允许代码执行继续进行,在函数中返回最后评估的表达式。这不是您想要的。

总体而言

当您想为最终用户提供输出时,请使用print()。在相同的情况下,使用cat()可以更好地控制输出。这对于“库代码”不适用,因为它不能轻松地被禁止。但是,这是执行任务的正确方式,例如发出数据以便在shell管道中处理,或编写“漂亮打印”有趣内容的函数。

在某些计算过程中产生的信息性消息(不是警告或错误),而用户没有明确请求输出时,请使用message()。例如,如果您正在开发一个软件包,并希望通知用户他们可以安装特殊依赖项以提高性能,则可以使用message()来发出此消息。用户可以使用suppressMessages来抑制消息。

使用warning()指示存在问题的情况,但不需要中止函数执行。例如,如果用户请求的操作非常缓慢,或者可能导致后续计算中的数值稳定性问题。用户可以使用suppressWarnings来抑制警告。
与上面类似,当某些情况非常严重以至于函数无法继续执行时,请使用error()。错误可以被捕获和处理(例如使用tryCatch),但是用户必须明确地进行这个操作。

技术部分

其他函数:messagewarningstop 每个都会发出(或“抛出”)一个条件。我不会详细介绍什么是条件,因为 Wickham 在 《Advanced R》第8章 中已经涵盖了它们。
简单来说,所有这3个函数都会向 R 运行时引入一个信号,但本身不会做任何事情。然后用户可以为特定条件安装一个“处理程序”,这是一个在条件发生时调用的函数。

R有默认处理程序来处理由message()warning()error()发出的条件信号。这就是这些函数的标准行为实现方式。


1
这是一个好的、详尽的回答。值得注意的是,用户可以通过 suppressMessages()suppressWarnings()抑制 message()warning();遇到不想要的“嘈杂”输出来自 cat()/print() 可能会令人沮丧(这在您的评论中隐含了用户可以为条件安装处理程序,但对于经验较少的用户并不明显)。 - Ben Bolker
@BenBolker 很好的观点,我更新了我的答案以包含那些信息。 - shadowtalker

1
实际上,您列出的示例都不正确,因为在 base 中有专门用于两种情况(警告/错误)的函数:
  • warning('a或b不是数字') 会产生一个警告信息,但继续执行
  • stop('a或b不是数字') 停止执行并抛出一个错误

谢谢,知道它们存在很好。我已经相应地编辑了问题,因为对我来说不清楚何时使用其中的任何五个(可能更多)选项。 - CodingBiology

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接