R 的良好编码习惯:message/cat/print/warning/error?
Good coding practices with R: message/cat/print/warning/error?
关于R包开发,当函数应该return错误信息或警告时,最好使用什么?:
cat()
print()
message()
error()
warning()
例如在这个函数中,当 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
),但用户必须明确地做到这一点。
技术部分
其他函数:message
、warning
和 stop
每个信号(或“抛出”)一个 条件。我不会详细说明条件是什么,因为 Wickham 在 chapter 8 of Advanced R.
中涵盖了它们
非常简单的版本是所有这 3 个都向 R 运行时引入一个信号,它自己什么都不做。然后,用户可以为特定条件安装“处理程序”,这是一个在条件出现时调用的函数。
R 具有针对 message()
、warning(),
和 error()
发出的条件的默认处理程序。这就是这些函数的标准行为是如何实现的。
关于R包开发,当函数应该return错误信息或警告时,最好使用什么?:
cat()
print()
message()
error()
warning()
例如在这个函数中,当 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
),但用户必须明确地做到这一点。
技术部分
其他函数:message
、warning
和 stop
每个信号(或“抛出”)一个 条件。我不会详细说明条件是什么,因为 Wickham 在 chapter 8 of Advanced R.
非常简单的版本是所有这 3 个都向 R 运行时引入一个信号,它自己什么都不做。然后,用户可以为特定条件安装“处理程序”,这是一个在条件出现时调用的函数。
R 具有针对 message()
、warning(),
和 error()
发出的条件的默认处理程序。这就是这些函数的标准行为是如何实现的。