R: Создание универсальной функции для 'split' из пакета 'base' в глобальной среде
Для простоты я буду использовать следующий пример кода:)
Я определил класс S4 test
, а потом, как обычно, я принял setMethod
написать обобщенную функцию split
для класса test
:
# define a S4 class
setClass(
Class="test",
representation=representation(
m = "matrix"
)
)
# write generic function 'split' for S4 class 'test'
setMethod(f = "split", signature = c("test"), function(x, f) {
split(x@m, f)
})
# call generic function for test
split(new("test", m=matrix(1:9,3)), c(1,2,3))
Запустите приведенный выше код, и командная строка R выдаст следующее сообщение:
Создание универсальной функции для "split" из пакета "base" в глобальной среде
и затем вывод программы следующий:
$`1`
[1] 1 4 7
$`2`
[1] 2 5 8
$`3`
[1] 3 6 9
Кажется, что вывод правильный. Но мой вопрос заключается в том, как подавить сообщение:
Создание универсальной функции для "split" из пакета "base" в глобальной среде
Большое спасибо:)
PS: я обнаружил, что заменить определение метода split
для класса S4 test
с формой того, как мы реализуем универсальные методы S3, избавимся от этого сообщения следующим образом:
split.test <- function(x, f) {
split(x@m, f)
}
Тем не менее, я не думаю, что это хорошая идея смешивать S3 и S4:)
0 ответов
Это печальная проблема с классами S4. Золотой стандарт часто называют Matrix
пакет. Они также ловко избегают этой проблемы: перегрузка rownames
или же colnames
(определено в base
) напрямую выдает одинаковое предупреждение. Но проверка этих функций показывает, что они являются удобными функциями для dimnames
функция:
> colnames
function (x, do.NULL = TRUE, prefix = "col")
{
if (is.data.frame(x) && do.NULL)
return(names(x))
dn <- dimnames(x)
# ...
}
> rownames
function (x, do.NULL = TRUE, prefix = "row")
{
dn <- dimnames(x)
# ...
}
> dimnames
function (x) .Primitive("dimnames")
Matrix
Пакет позволяет избежать этой проблемы, вместо этого определяя общий dimnames
, Как прокомментировал Майкл выше, лучше всего перегрузить [
оператор, который так же примитивен:
> `[`
.Primitive("[")
Заимствование из Matrix
Пакет снова, одно предложение будет:
setMethod("[", signature(x = "sparseMatrix", i = "missing", j = "index",
drop = "logical"),
function(x, i, j, ..., drop) {
# add any behavior for ...
`[`(x@m, i, j, drop=drop)
}
)
Это также добавляет много свободного поведения от других универсальных функций, использующих [
оператор.