我想与我的同事分享以R包形式在R中编写的一些函数。这些功能在很大程度上依赖于其他软件包,并且作为从业者,没有编程背景,因此我很难就我是否需要测试该功能使用中可能存在的错误(并创建相关的错误消息)。还是仅将其留给我正在使用的软件包的错误消息。
这是一个使我的观点更清楚的小例子:
Multiply_raster <- function(input_raster, multiplication_term) {
# Test for some things that might go wrong
if (is.element("raster", installed.packages()[, 1]) == F) {
stop(
"You do not have 'raster' installed. Please install the package before proceeding",
call. = F
)
}
if (class(input_raster) != "RasterLayer") {
stop("Please provide my_baselayer as an object of Class RasterLayer",
call. = F)
}
if (is.numeric(multiplication_term) == FALSE) {
stop("Error: Your multiplication term should be numeric", call. = F)
}
# load lib
library(raster)
# multply multiplication term with input raster
input_raster * multiplication_term
}
# data for Usage example
library(raster)
raster_example <- raster(matrix(rnorm(400), 20, 20))
首次测试
# Error test 1
Multiply_raster(raster_example, "5")
给予
> Multiply_raster(raster_example, "5")
Error: Error: Your multiplication term should be numeric
第二项测试
# Error test 2
Multiply_raster(1:5, 5)
给予
> Multiply_raster(1:5, 5)
Error: Please provide my_baselayer as an object of Class RasterLayer
没有错误消息的替代规范
# alternative function specification without own error messages
Multiply_raster_2 <-
function(input_raster, multiplication_term) {
# load lib
library(raster)
# multply multiplication term with input raster
input_raster * multiplication_term
}
首次测试
# Error test 1
Multiply_raster_2(raster_example, "5")
给予
> Multiply_raster_2(raster_example, "5")
Error in input_raster * multiplication_term :
non-numeric argument to binary operator
第二项测试
# Error test 2
Multiply_raster_2(1:5, 5)
给予
> Multiply_raster_2(1:5, 5)
[1] 5 10 15 20 25
我的解释:在错误测试的第一种情况下,我不一定需要逻辑测试和自己的错误消息,因为很明显,乘法仅适用于正确的数据类型。
在出现第二条错误消息的情况下,我将需要进行测试,因为否则R仍会评估函数,尽管输入数据不是栅格。
相关性:我之所以这样问,是因为两件事:首先,它花费相当多的时间并投入资源来预测用户在使用该功能时可能犯下的所有可能的错误。其次,我想避免冗余,特别是如果现有错误消息可能更有意义或更优于我自己的错误消息时。
我在tidyverse style-guide和Advanced R的技巧中搜索了有关此主题的答案,这些答案来自Hadley Wickham,但找不到明确的方向。