Skip to content

[R-es] Crear nuevos métodos para funciones genéricas existentes

3 messages · Antonio José Sáez Castillo, Carlos J. Gil Bellosta

#
Perdón por anticipado ante una pregunta sólo achacable a mi ignorancia 
en programación.

Estoy creando un nuevo paquete con una estructura "decente", en vez de 
las chapuzas que hacía hasta ahora. Defino una función que ajusta unos 
datos a una distribución que podemos llamar ND. La sintaxis de esta 
función sería, de forma resumida:

ND.fit<-function(x, start, ...){
...
  structure(list(estimate = res$par, sd = sds, vcov = vc, loglik = 
-res$value,
         method = method, convergence = res$convergence, n = n, obs = x, 
obsName = xName), class = "NDfit")
}

Ahora quiero crear nuevos métodos asociados a la clase NDfit para las 
funciones genéricas habituales. Por ejemplo:

coef.ND<-function (x, ...)
{
     if (!class(x) == "NDfit") {
         stop("Object must belong to class ND")
     }
     print.default(x$estimate, print.gap = 2, quote = FALSE)
     invisible(x)
}

El problema es que al hacerlo así, cuando hago

coef.ND(ajuste)

siendo "ajuste" un modelo ajustado clase NDfit, me sale bien, pero si hago

coef(ajuste)

me devuelve NULL. Lo mismo me pasa con print.ND, en cuyo caso me 
devuelve el resultado de la función print.default, o con logLik, donde 
me devuelve

Error en UseMethod("logLik") :
   no applicable method for 'logLik' applied to an object of class "NDfit"

He seguido las instrucciones que algunos de vosotros tenéis en vuestros 
foros, blogs, etc. Por ejemplo, Carlos J. Gil Bellosta propone en 
http://www.datanalytics.com/blog/2011/08/04/desarrollo-de-paquetes-con-r-iv-funciones-genericas/ 
el ejemplo que sí funciona siguiente:

plot.hola.hola <- function( x ) print( "caracola" )
a <- list()
class( a ) <- "hola.hola"
plot( a )

Así sí funcione, pero, ¿en qué se diferencia eso de lo que yo intento?

Gracias de antemano.
#
Hola, ¿qué tal?

Si el objeto que creas en ND.fit es de la clase NDfit, entonces, tu
función coef tiene que llamarse coef.NDfit (y no coef.ND).

Un saludo,

Carlos J. Gil Bellosta
http://www.datanalytics.com


El día 16 de abril de 2012 09:56, Antonio José Sáez Castillo
<ajsaez en ujaen.es> escribió:
#
¡Madre mía! Eso pasa por cambiar los nombres a medio camino. 
Originalmente había llamado a la clase sólo ND. Gracias por la pronta 
respuesta (y de paso, por todo el material adicional que ponéis a 
disposición de la comunidad).

El lunes, 16 de abril de 2012 10:02:16, Carlos J. Gil Bellosta escribió: