首页 > 解决方案 > 在 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技巧中搜索了有关此主题的答案,但找不到明确的方向。

标签: rfunctiondebuggingerror-handlingpackage

解决方案


推荐阅读