首页 > 解决方案 > R 的良好编码实践:消息/猫/打印/警告/错误?

问题描述

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

例如在这个函数中,当 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')
    }
}

标签: rprintingcat

解决方案


你的例子

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

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

一般来说

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

用于message()不是警告或错误但在用户没有特别请求输出的某些计算期间出现的信息性消息。例如,如果你正在开发一个包,并且你想通知用户他们可以安装一个特殊的依赖项来提高性能,你可以使用message()来发出这个消息。用户可以使用 来禁止消息suppressMessages

用于warning()指示不需要函数执行即可中止的有问题的情况。一个例子是,如果用户请求一个非常慢的动作,或者可能在以后的计算中导致数值稳定性问题。用户可以使用 来抑制警告suppressWarnings

如上所述,error()当某些事情完全错误以至于函数无法继续执行时使用。可以捕获和处理错误(例如,使用tryCatch),但用户必须专门执行此操作。

技术部分

其他函数:messagewarningstop每个信号(或“抛出”)一个条件。我不会详细说明条件是什么,因为 Wickham 在Advanced R的第 8 章中介绍了它们。

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

message()R 具有由和表示的条件的默认处理warning(),程序error()。这就是这些函数的标准行为的实现方式。


推荐阅读