2011-08-25 12 views
5

Sto cercando di capire un codice che non ho scritto (plot.gam in mgcv), e c'è una chiamata a una funzione plot() con alcuni parametri strani che non riconosco (ad esempio, "P") . Mi piacerebbe capire quale metodo di trama viene inviato su questa chiamata. findMethod() e funzioni simili non aiutano (penso che la trama sia S3). Ho provato la libreria di debug, ma questo non ti permette di "entrare in" una chiamata di funzione (e nemmeno le funzioni di debug di base).In R, come scoprire quale metodo viene inviato per una particolare chiamata di funzione?

Esiste un modo per monitorare tutte le chiamate di funzione e i relativi metodi inviati in R? O forse una funzione a cui posso passare una stringa contenente la chiamata della funzione effettiva (non solo la firma) che mi dirà quale metodo viene inviato?

+0

Solo una parte. . . quando si specificano i parametri in una chiamata di funzione, è possibile troncare il nome del parametro su qualsiasi cosa che non sia ambigua. Quindi, se c'è un solo parametro che _startizza_ con un 'P' nella firma, è possibile specificare tale parametro con' P = '. Questo non risponde alla tua domanda, quindi il motivo è un semplice commento. – adamleerich

risposta

5

In plot.gam() notiamo che plot() è chiamato x$smooth[[i]], che è un oggetto della classe:

class(x$smooth[[i]]) 
[1] "tprs.smooth" "mgcv.smooth" 

Ci è un metodo plot() per la classe "mgcv.smooth" ed è questo che viene utilizzato per la trama nel caso generale. ?plot.gam menziona che questo è il metodo predefinito per la maggior parte leviga, ma ci sono metodi specifici per determinati tipi di liscio supportati da gam() (dalla sezione Dettagli di ?plot.gam:

For smooth terms ‘plot.gam’ actually calls plot method functions 
depending on the class of the smooth. Currently random effect and 
Markov random field smooths have special methods, the rest use the 
defaults described below. 

Per qualche motivo, methods() è non trovando questi metodi, ma esistono:

> mgcv:::plot.mgcv.smooth 
function (x, P = NULL, data = NULL, label = "", se1.mult = 1, 
    se2.mult = 2, partial.resids = FALSE, rug = TRUE, se = TRUE, 
    scale = -1, n = 100, n2 = 40, pers = FALSE, theta = 30, phi = 30, 
    jit = FALSE, xlab = NULL, ylab = NULL, main = NULL, ylim = NULL, 
    xlim = NULL, too.far = 0.1, shade = FALSE, shade.col = "gray80", 
    shift = 0, trans = I, by.resids = FALSE, scheme = NULL, ...) 
{ 
.... 

Questo può essere correlato ad un bug nel methods() che significava plot.function non è stato mostrare n nella lista e la mia R attuale potrebbe non incorporare quella correzione. Questo metodo dovrebbe essere mostrato normalmente, e il consiglio generale in tali situazioni sarebbe quello di identificare la classe dell'oggetto (come ho mostrato sopra) e quindi usare methods() e funzioni simili (es. showMethods()) per identificare se metodi specifici disponibili per la classe (es.) dell'oggetto restituito.

+0

Sì, quello era il mio problema - non si presentava nei metodi(). Ma è giusto - grazie! – dan

2

Per le classi S3, methods("plot") fornirà tutti i metodi definiti per una funzione specifica. Come un invio S3, quello chiamato sarà basato sulla classe del primo argomento. Guardando plot.gam, presumo che la parte che si sta chiedendo circa inizia plot(x$smooth[[i]]), quindi hai bisogno di vedere ciò che la classe di x$smooth[[i]] è (dove x è l'oggetto oggetto gam) per determinare quali plot metodo verrà chiamato.

Non conosco un modo per farlo automaticamente.

+0

Ho provato a fare esattamente questo. So che x $ smooth [[i]] è di classe mgcv.smooth, ma non sono sicuro di come, con una classe S3, posso passare dal sapere che a sapere quale trama() viene inviata. Non c'è nulla di specifico che salta fuori da una chiamata a metodi(). Se questo fosse S4, qualcosa come getMethod() e la firma della classe funzionerebbero. Ma non sono sicuro di cosa fare con un metodo S3.(Ho esaminato manualmente tutte le funzioni di stampa visibili e nulla sembrava corretto.) – dan

+0

Typo: 'methods', not' method'. –

+0

@Hong, grazie. Fisso. –

0

Stampa la classe dell'oggetto dall'interno della funzione. O hackerare la funzione o usare trace().

Problemi correlati