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