2015-04-18 5 views
1

Je modifie une classe S4 s4c et je veux ajouter une méthode index. Étant donné que la classe est largement utilisée dans mon package personnalisé, le renommage n'est pas un choix. Par conséquent, je le faisComment définir une méthode générique qui existe déjà dans un package utilisé?

setGeneric(where = environment(), name="index", 
      def=function(x,include.from=T, include.to=T) standardGeneric("index") 
      ) 
#' @export 
setMethod(
    f = "index", 
    signature = "s4c", 
    definition = function (x, include.from, include.to) { 
... 

La méthode fonctionne. Mon problème est que je veux utiliser le paquet zoo également, où une fonction générique index existe déjà. Si je charge et FIXER le paquet je reçois le message

Les objets suivants sont masqués par « .GlobalEnv »: index

et, supposons que z être un objet de classe zoo si Je tape index(zoo) je reçois l'erreur

erreur dans (fonction (classes, FDEF mtable): incapable de trouver un hérité m ODE pour la fonction « index » à la signature « "zoo" »

Auparavant, je travaille avec une approche plus comme S3 comme

index.s4c <- function (x, include.from, include.to) { 
... 

et cela a fonctionné. Mais je veux éviter cela pour obtenir une classe S4 «pure». Ma tentative de travailler avec un environnement local via where = environment() ne fonctionne pas. Comment faire face à cela?

Un grand merci, Mika

Répondre

1

Utilisez setGeneric pour créer un index générique S4 qui utilise le S3 générique par défaut comme indiqué dans la ligne marquée ### ci-dessous. Ensuite, testez-le en créant une nouvelle classe "A" avec le composant x et un objet de cette classe pour le tester avec:

library(zoo) 

setGeneric("index") ### 

# test it out 

setClass("A", representation(x = "numeric")) 
setMethod("index", "A", function(x) [email protected]) 
a <- new("A", x = 99) 
index(a)  # index works on an object of our new class A 
## [1] 99 


z <- zoo(100) # zoo object with value 100 and index 1 
index(z)  # index still works on zoo objects 
## [1] 1 
+0

Il semble que je dois charger 'zoo' avant que je puisse faire' setGeneric ("index ")". Est-il possible de définir d'abord la méthode 'index' (car je n'ai besoin de' zoo' que pour certaines parties de mon paquetage)? –

+1

Essayez: 'setGeneric (" index ", zoo :: index)' –

+0

Cela fonctionne parfaitement. Je vous remercie. –