setGeneric для списка объектов - PullRequest
0 голосов
/ 17 марта 2019

У меня есть следующая функция:

myFunction = function(objects,params) {
  for (i in 1:length(objects)) {
     object = objects[[i]]
     object = myOtherFunction(objects, params)
     objects[[i]] = object
  }
 return (objects)
}
#' @rdname myFunction
#' @aliases myFunction
setMethod("myFunction", signature(object ="list"), myFunction)

Как правильно настроить методы setMethod() и setGeneric() для приема списка объектов данного типа, скажем, списка объектов типа SingleCellExperiment?

1 Ответ

1 голос
/ 20 марта 2019

Если вы хотите написать разные методы для обработки списков класса foo и списков класса bar, тогда S4 потребуется некоторая помощь, так как оба объекта относятся к классу list, и, следовательно, один и тот же метод будет вызываться в оба случая.

Есть несколько вариантов:

  • во-первых, вам вообще нужно использовать списки? Не забудьте, что все базовые типы в R являются векторами, поэтому для простых классов, таких как

    setClass("cuboid",slots=list( height="numeric", width="numeric", depth="numeric" )) -> cuboid

если вы хотите представить набор из нескольких кубоидов, вам вообще не нужно использовать список, просто введите векторы значений в cuboid. Это не работает так же для более экзотических классов.

  • альтернативно, вы можете написать метод list с некоторой дополнительной логикой, чтобы определить, какой метод более низкого порядка следует отправить. Вам также следует подумать о том, что делать, если список содержит объекты нескольких разных классов.

  • в некоторых ситуациях вы можете использовать либо lapply, либо функцию, которая принимает произвольное число аргументов через .... В последнем случае вы можете использовать dotsMethods (для получения дополнительной информации обратитесь к странице справки по этой теме).

Если вы хотите написать метод, который будет вызываться только в списках объектов класса foo, и может существовать другой метод, который хочет работать со списками, то вы можете:

  • написать метод для класса foo напрямую, а затем использовать sapply или lapply вместо вызова вашей функции в списке
  • написать метод для класса list, который проверяет, есть ли в списке foo s, а если нет, вызывает nextMethod.
...