R 的良好编码习惯:message/cat/print/warning/error?

Good coding practices with R: message/cat/print/warning/error?

关于R包开发,当函数应该return错误信息或警告时,最好使用什么?:

例如在这个函数中,当 a 或 b 不是数字时,我应该使用哪一个来 return 错误消息。

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')
    }
}

实际上,none 你列出的示例,因为 base 中有函数,特别是对于两种 (warning/error) 情况:

  • warning('a or b are not numbers') 将导致警告消息但继续执行
  • stop('a or b are not numbers') 停止执行并抛出错误

你的例子

在这种特殊情况下,唯一明智的选择是使用 stop(),因为 这种情况是错误的,而您想要停止遇到错误时继续的函数。

其他选项将允许代码继续执行,返回函数中最后计算的表达式。这不是你想要的。

一般

当您想为最终用户提供输出时使用print()。使用 cat() 可以更好地控制相同情况下的输出。这适合“库码”,因为不容易压制。但是,这是执行任务的正确方法,例如将数据发送到标准输出以在 shell 管道中进行处理,或者编写“漂亮打印”有趣内容的函数。

message() 用于不是警告或错误的信息性消息,而是在用户未明确请求输出的某些计算过程中出现的信息性消息。例如,如果你正在开发一个包,你想通知用户他们可以安装一个特殊的依赖来提高性能,你可以使用 message() 来发出这个消息。用户可以使用 suppressMessages.

来抑制消息

使用warning()表示有问题的情况不需要函数执行来中止。例如,如果用户请求的操作非常慢,或者可能会在以后的计算中导致数值稳定性问题。用户可以使用 suppressWarnings.

来抑制警告

如上,当出现完全错误以至于函数无法继续执行时使用error()。错误可以被捕获和处理,(例如使用 tryCatch),但用户必须明确地做到这一点。

技术部分

其他函数:messagewarningstop 每个信号(或“抛出”)一个 条件。我不会详细说明条件是什么,因为 Wickham 在 chapter 8 of Advanced R.

中涵盖了它们

非常简单的版本是所有这 3 个都向 R 运行时引入一个信号,它自己什么都不做。然后,用户可以为特定条件安装“处理程序”,这是一个在条件出现时调用的函数。

R 具有针对 message()warning(),error() 发出的条件的默认处理程序。这就是这些函数的标准行为是如何实现的。