2010-01-31 10 views
11

¿Cómo puedo ver la definición de una función S4? Por ejemplo, me gustaría ver la definición de TSconnect en el paquete TSdbi. El comandoInspeccionar los métodos S4

showMethods("TSconnect") 

revela que hay, entre otros, una función para DRV = "histQuoteDriver", nombredb = "carácter".

¿Cómo puedo ver la definición de esta función? Si fuera una función S3, solo habría el primer argumento definible (drv), que podría inspeccionarse con print (TSconnect.histQuoteDriver).

Editar: A partir de R-forja descubrí la salida deseada:

setMethod("TSconnect", signature(drv="histQuoteDriver", dbname="character"), 
    definition= function(drv, dbname, user="", password="", host="", ...){ 
    # user/password/host for future consideration 
    if (is.null(dbname)) stop("dbname must be specified") 
    if (dbname == "yahoo") { 
     con <- try(url("http://quote.yahoo.com"), silent = TRUE) 
     if(inherits(con, "try-error")) 
     stop("Could not establish TShistQuoteConnection to ", dbname) 
     close(con) 
     } 
    else if (dbname == "oanda") { 
     con <- try(url("http://www.oanda.com"), silent = TRUE) 
     if(inherits(con, "try-error")) 
     stop("Could not establish TShistQuoteConnection to ", dbname) 
     close(con) 
     } 
    else 
     warning(dbname, "not recognized. Connection assumed working, but not tested.") 

    new("TShistQuoteConnection", drv="histQuote", dbname=dbname, hasVintages=FALSE, hasPanels=FALSE, 
     user = user, password = password, host = host) 
    }) 

¿Hay una manera de conseguir esta definición desde una sesión de I?

+0

Puede encontrar http://stevencarlislewalker.wordpress.com/s3-s4-dictionary/ useful. –

Respuesta

10

Las clases de S4 son relativamente complicadas, por lo que sugeriría reading this introduction.

En este caso, TSdbi es un ejemplo de una clase S4 genérica que se extiende por todos los paquetes de bases de datos específicos (por ejemplo, TSMySQL, TSPostgreSQL, etc.). No hay nada más al método TSconnect() en TSdbi que lo que está viendo: drv = "character", dbname = "character" son parámetros de la función, no funciones en sí mismas. Si instala algunos de los paquetes de bases de datos específicos y usa showMethods ("TSconnect"), verá todas las instancias específicas de esa función. Si luego llama a TSconnect() con un controlador de base de datos específico, irá y usará la función apropiada.

Así es como funcionan funciones como el resumen también. Por ejemplo, intente llamar al showMethods(summary). Dependiendo de qué paquetes se carguen, debería ver múltiples métodos devueltos

Puede ver fácilmente el código fuente para ello en R-Forge: http://r-forge.r-project.org/plugins/scmsvn/viewcvs.php/pkg/TSdbi/R/TSdbi.R?rev=70&root=tsdbi&view=markup. Este es el alcance de esa función:

setGeneric("TSconnect", def= function(drv, dbname, ...) standardGeneric("TSconnect")) 

setMethod("TSconnect", signature(drv="character", dbname="character"), 
    definition=function(drv, dbname, ...) 
      TSconnect(dbDriver(drv), dbname=dbname, ...)) 
+1

El tutorial S4 y el enlace al repositorio r-forge son muy útiles. He editado mi pregunta para que quede más clara. –

+0

+1 para el enlace. –

Cuestiones relacionadas