modificare lm o la funzione loess di utilizzarlo all'interno di geom_smooth ggplot2
Domanda
ho bisogno di modificare la lm
(o eventualmente loess
) Funzione di modo che io possa utilizzarlo in geom_smooth
di ggplot2 (o stat_smooth
).
Ad esempio, questo è il modo stat_smooth
viene utilizzato normalmente:
> qplot(data=diamonds, carat, price, facets=~clarity) + stat_smooth(method='lm')`
vorrei definire una funzione lm2
personalizzato da utilizzare come valore per il parametro method
in stat_smooth
, in modo da poter personalizzare il suo comportamento.
> lm2 <- function(formula, data, ...)
{
print(head(data))
return(lm(formula, data, ...))
}
> qplot(data=diamonds, carat, price, facets=~clarity) + stat_smooth(method='lm2')
Si noti che ho usato come parametro di method='lm2'
in stat_smooth
.
Quando eseguo questo codice un l'errore:
Errore in eval (espressione, Envir, enclos): 'nthcdr' ha bisogno di un elenco di CDR giù
Il che non capisco molto bene. Il metodo lm2
funziona molto bene quando eseguito al di fuori della stat_smooth
. Ho giocato con questo un po 'e ho avuto diversi tipi di errore, ma dal momento che non trovo a mio agio con gli strumenti di debug di R è difficile per me per eseguire il debug di loro. Onestamente, non capisco che cosa devo mettere dentro la chiamata return()
.
Soluzione
C'è qualche stranezza nel usando ... come argomento in una chiamata di funzione che non ho pienamente capito (che ha qualcosa a che fare con ... essendo un oggetto elenco-tipo).
Ecco una versione che funziona prendendo la chiamata di funzione come un oggetto, impostare la funzione di essere chiamati a lm e poi valutare la chiamata nel contesto della nostra chiamante. Il risultato di questa valutazione è il nostro valore di ritorno (in R il valore dell'ultima espressione di una funzione è il valore restituito, quindi non abbiamo bisogno di un return
esplicito).
foo <- function(formula,data,...){
print(head(data))
x<-match.call()
x[[1]]<-quote(lm)
eval.parent(x)
}
Se si desidera aggiungere argomenti alla chiamata lm, si può fare in questo modo:
x$na.action <- 'na.exclude'
Se si vuole far cadere argomenti per pippo prima di chiamare lm, si può fare in questo modo
x$useless <- NULL
A proposito, geom_smooth
e stat_smooth
passare alcun argomento in più per la funzione di smoothing, quindi non è necessario creare una funzione della propria, se avete solo bisogno di impostare alcuni argomenti extra
qplot(data=diamonds, carat, price, facets=~clarity) +
stat_smooth(method="loess",span=0.5)