Как написать функцию ac () для пользовательского класса S3 в R

Я пишу класс S3 в R, который просто целое число с прикрепленными к нему атрибутами. Если x1 и x2 являются объектами этого класса (назовите его «myclass»), то я хотел бы, чтобы c (x1, x2) возвращал вектор объектов myclass с исходным определением класса и атрибутами без изменений. Тем не мение, документированное поведение c () заключается в удалении атрибутов, поэтому может показаться, что мне нужно написать свой собственный метод c.myclass (). У меня вопрос: как это сделать?

Пример проблемы:

myclass <- function(x, n) structure(x, class="myclass", n=n)
x1 <- myclass(1, 5)
x2 <- myclass(2, 6)
c(x1, x2)
[1] 1 2

Здесь результат представляет собой просто вектор элементов класса numeric, а исходный атрибут n пропал.

Глядя на код для различных пакетов я иногда вижу код вроде следующего, в котором нам нужно сохранить атрибут class, но ничего больше:

c.myclass <- function(..., recursive = F) {
    structure(c(unlist(lapply(list(...), unclass))), class="myclass")
}

К сожалению, я также не могу заставить это работать. Результатом вызова c.myclass (x1, x2) является вектор, в котором сам вектор имеет класс myclass, но где каждый элемент в векторе имеет класс numeric; Я действительно хочу, чтобы каждый элемент в векторе имел класс myclass. На практике мне также потребуется обновить этот метод, чтобы сохранить и другие атрибуты (например, атрибут "n" в myclass).

6
задан Argalatyr 21 July 2014 в 10:07
поделиться