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)
    }
)

Это также добавляет много свободного поведения от других универсальных функций, использующих [ оператор.

Другие вопросы по тегам