r - 在 R 中编写函数时,我应该何时使用自己的错误消息?
问题描述
我想以 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和 Hadley Wickham 的Advanced R技巧中搜索了有关此主题的答案,但找不到明确的方向。
解决方案
推荐阅读
- ios - Flutter Xcode build failed 错误无法生成进程
- python - 将部分值分配给数据集中的一组特征,涵盖python中没有小数和余数的总值
- windows - 配置:配置中缺少名称 WorldDatabaseInfo
- mongodb - mongodb pull 功能为什么不能在我的情况下工作?
- laravel - Laravel:是否可以直接从书籍集合中获取所有作者而无需循环?
- amazon-elastic-beanstalk - 如何在 Elastic Beanstalk 部署解压缩上传的文件后执行批处理作业
- dataframe - 在 DataFrame 中使用带空格的列名进行查询
- python - Python Regex - 如何考虑行尾和文件尾并仅打印字符串的子部分?
- php - 仅在具有 Elementor 的小部件上隐藏缺货的 WooCommerce 产品
- python - 如何解决 Dlib Visual Studios C++ 错误?