Je travaille sur un paquet qui étend un autre paquet, et tous les deux utilisent des classes et des méthodes S4. Plus précisément, je travaille sur le paquet sads
, qui prolonge le bbmle
de Ben Bolker. Notre code source complet est ici: https://github.com/piLaboratory/sadsEst-il possible de redéfinir une classe S4 dans R?
Jusqu'ici, j'ai réussi à créer de nouvelles classes qui étendent la classe mle2
S4 du paquet bbmle
. Ces lignes font bien:
setClass("fitsad", representation("mle2", sad="character",
distr="character", trunc="numeric"))
setClass("fitrad", representation("mle2", rad="character",
distr="character", trunc="numeric", rad.tab="rad"))
Cependant, je ne suis pas en mesure de redéfinir proprement une classe qui a été défini dans bbmle
. La classe summary.mle2
est définie dans le code source bbmle
, mais supposons que j'ai besoin de définir une nouvelle classe avec le même nom. L'ajout de la ligne suivante à mon code source entraîne un comportement bizarre:
setClass("summary.mle2", representation(call = "language",
coef = "matrix",m2logL = "numeric", fixed="numeric"))
Avec cette redéfinition, le paquet peut être chargé, et tout le code fonctionne comme prévu. Cependant, en essayant de décharger l'espace de noms résultats dans l'erreur cryptique:
> library(sads) ## No errors here
> unloadNamespace("sads")
Error in .getClassFromCache(what, resolve.confl = "all") :
argument "where" is missing, with no default
> traceback()
4: .getClassFromCache(what, resolve.confl = "all")
3: .removeSuperclassBackRefs(cl, cldef, searchWhere)
2: methods::cacheMetaData(ns, FALSE, ns)
1: unloadNamespace("sads")
Indépendamment de la question de savoir si nous devrions en train de redéfinir cette classe ou non, est-ce possible de le faire? Je suis désolé de ne pas être capable de présenter un exemple minimal ici, mais je n'ai pas été capable de reproduire cette erreur sans charger/décharger l'espace de nom du paquet.