Antonio José Sáez Castillo
2012-Apr-16 07:56 UTC
[R-es] Crear nuevos métodos para funciones genéricas existentes
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. -- Dr. Antonio José Sáez Castillo Dpto. de Estadística e Investigación Operativa Escuela Politécnica Superior de Linares Universidad de Jaén C/ Alfonso X El Sabio 28, 23700 Linares (Jaén) ESPAÑA Tlf. y FAX +34 953 648578
Carlos J. Gil Bellosta
2012-Apr-16 08:02 UTC
[R-es] Crear nuevos métodos para funciones genéricas existentes
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ó:> 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. > > -- > Dr. Antonio José Sáez Castillo > Dpto. de Estadística e Investigación Operativa > Escuela Politécnica Superior de Linares > Universidad de Jaén > C/ Alfonso X El Sabio 28, 23700 Linares (Jaén) ESPAÑA > Tlf. y FAX +34 953 648578 > > _______________________________________________ > R-help-es mailing list > R-help-es en r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es