2016-05-11 7 views
1

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.

Répondre

2

Ripped des titres de r {Base}

setAs(from, to, def, replace, where = topenv(parent.frame()))

Vous pouvez l'utiliser si vous tapez ?setAs() pour forcer à partir d'un S4 à une classe S3

dans la ligne d'aide devrait obtenir vous 90% du chemin là-bas! Vous pouvez utiliser class() pour voir si cela fonctionne! Faites-moi savoir si cela fonctionne pour vous. Si vous êtes coincé alors je ferai de mon mieux pour vous aider.