2010-12-09 3 views
4

J'ai quelques problèmes à faire reconnaître une classe d'un ancien paquet par la définition de classe S4. Je continue à obtenir l'erreurReconnaissance d'une classe S3 (?) À partir d'un package dans une définition de classe S4

Error in makePrototypeFromClassDef(properties, ClassDef, immediate, where) : 
    in making the prototype for class "Tsvmm" elements of the prototype failed to 
    match the corresponding slot class: dates (class "dates") 
In addition: Warning message: 
undefined slot classes in definition of "Tsvmm": dates(class "dates") 

Un exemple reproductible:

require(chron) 

setClass(
    Class="Tsvmm", 
    representation=representation(
     data = "data.frame", 
     dates = "dates" 
), 
    prototype=prototype(
     data = data.frame(), 
     dates = chron(0) 
) 
) 

Lorsque vous essayez class(chron(0)), la réponse est "dates" "times". en utilisant is.numeric(chron(0)), la réponse est TRUE. Pourtant, lorsque je définis la classe de dates de logement comme "numeric", j'obtiens la même erreur sans le message d'avertissement. J'ai le sentiment que je néglige quelque chose d'évident, mais je ne pouvais pas le trouver dans la documentation pour le moment. Quelqu'un a des pointeurs? PS: Je sais que le paquet chron est au moins particulier, mais j'ai de bonnes raisons de l'utiliser. De plus, le problème est susceptible de se produire avec d'autres paquets. Voir ceci comme un exemple pour une question générale. Alors s'il vous plaît, ne me dites pas d'utiliser les classes Date ou POSIXt. C'est un hack que j'utilise maintenant.

+2

wowThatFunctionNameIsLong() –

Répondre

6

Il semble que vous ayez besoin de setOldClass pour que les méthodes croient que les dates sont une vraie classe.

+1

bingo! Merci –

2

J'ai un problème similaire parce que les objets Gtk2 (par exemple, Gtk2 :: GtkBuilder) ne sont pas des classes S4 alors que je voulais une instance d'un tel objet dans mon propre code. Je pense que j'ai travaillé sur la situation en supprimant la chose prototype() et en utilisant une méthode "initialize()".

Questions connexes