Вы можете определить метод по умолчанию, который обрабатывает все, кроме матриц. Затем в матричном методе, если это что-то другое, кроме numeri c, вы просто вызываете NextMethod
, который вызывает метод по умолчанию. Поэтому вам нужно написать только одно сообщение об ошибке и один матричный метод.
# Here's a stand in for your C function:
add_one_in_c <- function(x) x + 1
AddOne <- function(x) UseMethod('AddOne')
AddOne.default <- function(x) stop("No applicable method")
AddOne.matrix <- function(x) if (is.numeric(x)) add_one_in_c(x) else NextMethod()
Итак, протестировав его, мы получим:
char_matrix <- matrix(LETTERS[1:9], nrow = 3)
num_matrix <- matrix(1:9, nrow = 3)
AddOne(num_matrix)
#> [,1] [,2] [,3]
#> [1,] 2 5 8
#> [2,] 3 6 9
#> [3,] 4 7 10
AddOne(char_matrix)
#> Error in AddOne.default(char_matrix) : No applicable method
AddOne(1:9)
#> Error in AddOne.default(1:9) : No applicable method
Дополнение
Другой способ сделать это, упрощая добавление методов для других классов по мере необходимости, - использовать функцию AddOne
в качестве «привратника», который гарантирует, что обрабатываются только матрицы, и который затем отправляет S3 метод в соответствии с классом базовых данных:
add_one_in_c <- function(x) x + 1
AddOne <- function(x)
{
if(class(x) != "matrix") stop("No applicable method")
return(AddOne_basic(as.vector(x), nrow(x), ncol(x)))
}
AddOne_basic <- function(x, r, c) UseMethod("AddOne_basic")
AddOne_basic.default <- function(x, r, c) stop("No appicable method")
AddOne_basic.numeric <- function(x, r, c) {
dim(x) <- c(r, c);
add_one_in_c(x)
}
Итак, чтобы расширить обработку AddOne
на другие базовые c типы, вы добавляете соответствующий метод AddOne_basic
. Очевидно, что при написании пакета вы можете решить не экспортировать "внутренние" AddOne_basic
методы.