Если вы хотите написать разные методы для обработки списков класса 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
.