Ispezionare i metodi S4
-
24-09-2019 - |
Domanda
Come posso visualizzare la definizione di una funzione S4? Ad esempio, vorrei vedere la definizione di TSConnect nel pacchetto TSDBI. Il comando
showMethods("TSconnect")
rivela che esiste, tra gli altri, una funzione per drv = "histQuotedriver", dbname = "personaggio".
Come posso vedere la definizione di questa funzione? Se fosse una funzione S3, ci sarebbe solo il primo argomento definibile (DRV), che potrebbe essere ispezionato con la stampa (tsconnect.histquotedriver).
Modificare: Da R-Forge ho scoperto l'output desiderato:
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 )
} )
C'è un modo per ottenere questa definizione all'interno di una sessione R?
Soluzione
Le classi S4 sono relativamente complicate, quindi suggerirei Leggendo questa introduzione.
In questo caso, TSDBI è un esempio di una classe S4 generica che viene estesa da tutti i pacchetti di database specifici (ad es. TSMYSQL, Tspostgresql, ecc.). Non c'è più nulla nel metodo tsconnect () in TSDBI di quello che stai vedendo: drv = "carattere", dbname = "carattere" sono parametri della funzione, non funzionano in e per sé. Se si installano alcuni dei pacchetti di database specifici e usi ShowMethods ("TSConnect") vedrai tutte le istanze specifiche di quella funzione. Se si chiama TSConnect () con un driver di database specifico andrà e utilizzerà la funzione appropriata.
Ecco come anche funzioni come il lavoro di riepilogo. Ad esempio, prova a chiamare showMethods(summary)
. A seconda di quali pacchetti vengono caricati, è necessario vedere più metodi restituiti
Puoi facilmente vedere il codice sorgente su R-Forge: http://r-forge.r-project.org/plugins/scmsvn/viewcvs.php/pkg/tsdbi/r/tsdbi.r?rev=70&root=tsdbi&view=markup. Questa è l'estensione di quella funzione:
setGeneric("TSconnect", def= function(drv, dbname, ...) standardGeneric("TSconnect"))
setMethod("TSconnect", signature(drv="character", dbname="character"),
definition=function(drv, dbname, ...)
TSconnect(dbDriver(drv), dbname=dbname, ...))