Используйте data () как универсальную функцию S4 - PullRequest
3 голосов
/ 04 июля 2011

Я пытаюсь определить новый метод data для класса foo. Мои foo объекты имеют следующую структуру:

setClass(Class = "foo", 
    representation = representation(
        data = "data.frame", 
        id = "character",   
        wl = "numeric"
    )
)

Метод data, который я пытаюсь создать, фактически обращается к содержимому слота @data:

setMethod("data", "foo",
    function(object)
        object@data
)

Я просматривал раздел 7.1 руководства по написанию расширений R, но он касается только классов S3. Я также посмотрел на этот пост , но безуспешно:

setGeneric("data", function(object, ...) standardGeneric('data'))

setMethod("data", "ANY", utils::data)

setMethod("data", "foo",
  function(object)
    object@data
)

При загрузке пакета:

> data(mtcars)
Error in function (classes, fdef, mtable)  : 
  unable to find an inherited method for function "data", for signature "data.frame"

Ответы [ 2 ]

5 голосов
/ 04 июля 2011

Pierre,

Первый аргумент data - это ... (не object!), Поэтому вам необходимо принять во внимание некоторые особые соображения для отправки.? dotsMethods обсуждает это.

Часто (например, cbind, rbind), быстрое и грязное решение состоит в том, чтобы использовать нотацию метода S3 для этих функций

data.foo <- function (...) {
   x <- list (...) [[1]]
   x@data
} 

Однако ядумаю, у вас возникли проблемы, потому что исходная функция данных использует неоцененное имя аргумента, и сообщение об ошибке предполагает, что он оценивается (имеет смысл: как R может знать, какой класс имеет аргумент, если он не оценивает?)перед вызовом исходной функции данных.

Таким образом, в конце может оказаться гораздо проще использовать другое имя, чем data (), для доступа к вашему слоту данных.

(Ваш слот wl заставляет меня думать о длинах волн: если вы настраиваете класс для спектроскопических данных, взгляните на hyperSpec - он может уже обеспечить то, что вам нужно).

0 голосов
/ 24 октября 2013

Что помогло мне (я нахожусь в мире S3), было создать функцию по умолчанию, которая вызывает data() из базового пакета utils:

data.default <- function(...){
 utils::data(...)
}

Тогда диспетчеризация ведет себя как ожидалось:

data(mtcars)
mtcars
                     mpg cyl  disp  hp drat    wt  qsec vs am gear carb
Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
Datsun 710          22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
...