J'écris une classe S3 dans R qui est juste un entier avec des attributs attachés. Si x1 et x2 sont des objets de cette classe (appelez-la "myclass"), alors je voudrais que c (x1, x2) renvoie un vecteur d'objets myclass avec la définition de classe d'origine et les attributs intacts. Cependant, le comportement documenté de c() est de supprimer des attributs, il semblerait donc que j'ai besoin d'écrire ma propre méthode c.myclass(). Ma question est, comment puis-je faire cela?Comment écrire une fonction c() pour une classe S3 personnalisée dans R
Un exemple du problème:
myclass <- function(x, n) structure(x, class="myclass", n=n)
x1 <- myclass(1, 5)
x2 <- myclass(2, 6)
c(x1, x2)
[1] 1 2
Voici le résultat est juste un vecteur d'éléments de classe numériques, et l'attribut original n est parti.
En regardant le code pour différents forfaits, je vois parfois code comme suit, dans laquelle nous devons conserver l'attribut de classe mais rien d'autre:
c.myclass <- function(..., recursive = F) {
structure(c(unlist(lapply(list(...), unclass))), class="myclass")
}
Malheureusement je ne peux pas non plus que cela fonctionne. Le résultat de l'appel de c.myclass (x1, x2) est un vecteur où le vecteur a lui-même la classe "myclass" mais où chaque élément du vecteur a une classe numérique; Je veux vraiment que chaque élément du vecteur ait la classe "myclass". En pratique, je devrai également mettre à jour cette méthode pour préserver d'autres attributs (comme l'attribut "n" dans myclass).
Merci Joshua, votre suggestion a fonctionné. – Abiel