2017-04-13 10 views
0

J'ai du mal à trouver un moyen facile de modifier les objets S4 ayant de nombreux emplacements. Un exemple de jouet est:Comment combiner ou modifier des objets S4?

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) 

Ceci est trivial car la classe First ne contient qu'un seul slot (foo). Existe-t-il un moyen facile de combiner/modifier les objets S4 qui contiennent de nombreux emplacements?

Répondre

-1

Oui, la plupart des personnes qui créent des objets S4 créent une variété de méthodes pour les manipuler de la manière dont vous seriez le plus enclin à manipuler les données pour votre objectif.

Parfois, cela est en créant une nouvelle méthode spécifique à la classe entière pour accomplir une tâche spécifique et d'autres, il est en créant un do qui indique R pour appliquer la mise en œuvre spécifique à la classe d'une fonction générique existante (comme rbind ou summary) vous pouvez lire ici:

Bioconductor S4 Tutorial

Cela devrait vous obtenir dirigé dans la bonne direction créer vos propres fonctions ou la personnalisation des génériques existants pour travailler avec vos objets.

0

On dirait que vous essayez d'instancier une sous-classe avec les valeurs d'une instance de classe parente. Je ne pense pas qu'il existe un moyen facile de le faire, mais cela peut être fait. Ici, nous récupérons les valeurs d'emplacement d'instance de classe parent et utilisons do.call pour instancier un objet de classe enfant:

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