Frage

Ich schreibe in R eine S3-Klasse, die nur eine ganze Zahl mit einigen Attributen ist an ihn. Wenn x1 und x2 Objekte dieser Klasse sind (nennen wir es „myclass“), dann würde Ich mag c (x1, x2) einen Vektor von myclass Objekte mit der ursprünglichen Klassendefinition zurückzukehren und Attribute intakt. Allerdings ist das dokumentierte Verhalten von c () Attribute zu entfernen, so würde es scheinen, dass ich meine eigene c.myclass () -Methode zu schreiben. Meine Frage ist, wie kann ich das tun?

Ein Beispiel für das Problem:

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

Hier ist das Ergebnis nur ein Vektor von Elementen der Klasse numerisch, und das ursprüngliche n Attribut ist weg.

Mit Blick auf den Code für verschiedene Pakete, ich sehe manchmal Code wie die folgenden, in denen müssen wir die Klasse Attribut erhalten, aber sonst nichts:

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

Leider kann ich auch nicht, dies zu arbeiten. Das Ergebnis des Aufrufs c.myclass (x1, x2) ist ein Vektor, bei dem der Vektor selbst Klasse „myclass“ hat, aber wo jedes Element in dem Vektor hat Klasse numerisch; Ich mag wirklich jedes Element in der Vektorklasse „myclass“ haben. In der Praxis werde ich auch diese Methode aktualisieren muß andere Attribute zu bewahren als auch (wie das Attribut „n“ in myclass).

War es hilfreich?

Lösung

Dies funktioniert, aber ich nehme an, Sie schließen daraus, dass jedes Vektorelement Klasse numerisch hat, weil Sie so etwas wie dies tun:

foo <- c(x1, x2)
class(foo[1])
class(foo[2])

Wenn das der Fall ist, und Sie möchten extrahierten Elemente die myclass Attribut erhalten wollen, müssen Sie eine Teilmenge Methode "[.myclass" schreiben, um die Attribute zu erhalten.

Andere Tipps

Hier ist ein Beispiel, das tut (glaube ich), was Sie über spezifische Methoden wollen für c und [:

c.myclass <- function(..., recursive = FALSE) {
    dots <- list(...)
    ns <- sapply(dots, attr, which = "n")
    classes <- rep("myclass", length(dots))
    res <- structure(unlist(dots, recursive = FALSE), class = classes)
    attr(res, "n") <- ns
    res
}

`[.myclass` <- function (x, i) {
    y <- unclass(x)[i]
    ns <- attr(x, "n")[i]
    class(y) <- "myclass"
    attr(y, "n") <- ns
    y
}


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

Aber das ist ein Fudge, dass wir die Einstellung verwalten haben Handhabung und subsetting von zusätzlichen Attributen der n zu halten. Das ist wirklich nur ein numerischer Vektor mit einem Attribut für die Aufzeichnung n.

Es könnte natürlich sein, um die Arbeit mit dem generischen allen Vektoren, eine Liste. Bit, die mehr beteiligt und vielleicht die oben her ist ausreichend in Ihrem Fall?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top