Когда я должен использовать собственные сообщения об ошибках при написании функций в R? - PullRequest
0 голосов
/ 04 марта 2019

Я хотел бы поделиться некоторыми некоторыми функциями, которые я написал в 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 и в советах Advanced R от Хэдли Уикхем, но не смог найти четкую ориентацию по этому вопросу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...