2017-04-13 7 views
0

Ich habe Mühe, eine einfache Möglichkeit zu finden, S4-Objekte mit vielen Slots zu modifizieren. Ein Spielzeugbeispiel ist:Wie kombiniere oder modifiziere ich S4-Objekte?

setClass(
    Class = "First", 
    slots = c(foo = "numeric") 
) 
setClass(
    Class = "Second", 
    slots = c(bar = "numeric"), 
    contains = "First" 
) 
dog <- new(Class="First", 
      foo = 1) 
cat <- new(Class="Second", 
      foo = [email protected], 
      bar = 1) 
str(cat) 

Dies ist trivial, weil Klasse First nur einen Steckplatz (foo) enthält. Gibt es eine einfache Möglichkeit, S4-Objekte, die viele Slots enthalten, zu kombinieren/zu modifizieren?

Antwort

-1

Ja, die meisten Leute, die S4-Objekte erstellen, erstellen eine Vielzahl von Methoden, um an ihnen so zu arbeiten, wie es am besten wäre, Daten für Ihren bestimmten Zweck zu manipulieren.

Manchmal ist das durch eine ganz neue klassenspezifische Verfahren zu schaffen, eine bestimmte Aufgabe und andere zu erreichen es durch die Schaffung eines do ist, dass R die klassenspezifische Implementierung einer bestehenden generische Funktion (wie rbind oder summary anzuwenden anweist) können Sie sich hier darüber lesen:

Bioconductor S4 Tutorial

Dies sollten Sie in die richtige Richtung Erstellung eigener Funktionen oder die Anpassung bestehender Generika mit Ihren Objekten arbeiten geleitet.

0

Anscheinend versuchen Sie, eine Unterklasse mit den Werten einer übergeordneten Klasseninstanz zu instanziieren. Ich glaube nicht, dass es einen einfachen Weg dafür gibt, aber es kann getan werden. Hier rufen wir die Elternklasseninstanzschlitzwerte ab und verwenden do.call, um ein Kindklassenobjekt zu instanziieren:

par.slots <- sapply(slotNames(dog), slot, object=dog, simplify=F) 
do.call("new", c("Second", bar=1, par.slots)) 

## An object of class "Second" 
## Slot "bar": 
## [1] 1 
## 
## Slot "foo": 
## [1] 1