Modifique a função LM ou Loess para usá -la no GGPLOT2's geom_smooth
Pergunta
Eu preciso modificar o lm
(ou eventualmente loess
) função para que eu possa usá -lo no GGPLOT2 geom_smooth
(ou stat_smooth
).
Por exemplo, é assim que stat_smooth
é usado normalmente:
> qplot(data=diamonds, carat, price, facets=~clarity) + stat_smooth(method='lm')`
Eu gostaria de definir um costume lm2
função para usar como valor para o method
parâmetro em stat_smooth
, para que eu possa personalizar seu comportamento.
> lm2 <- function(formula, data, ...)
{
print(head(data))
return(lm(formula, data, ...))
}
> qplot(data=diamonds, carat, price, facets=~clarity) + stat_smooth(method='lm2')
Observe que eu usei method='lm2'
como parâmetro em stat_smooth
. Quando eu executo este código A GET O ERRO:
Erro em Eval (Expr, Envir, Enclos): 'NTHCDR' precisa de uma lista para CDR Down
O que eu não entendo muito bem. o lm2
o método funciona muito bem quando executado fora de stat_smooth
. Eu brinquei um pouco com isso e tenho diferentes tipos de erro, mas como não me sinto confortável com as ferramentas de depuração do R, é difícil para mim depurar. Honestamente, eu não entendo o que devo colocar dentro do return()
ligar.
Solução
Há alguma estranheza em usar ... como um argumento em uma chamada de função que eu não entendo completamente (tem algo a ver com ... ser um objeto do tipo lista).
Aqui está uma versão que funciona atendendo a chamada de função como um objeto, definindo a função a ser chamada para LM e avaliando a chamada no contexto de nosso próprio chamador. O resultado dessa avaliação é o nosso valor de retorno (em r o valor da última expressão em uma função é o valor retornado, por isso não precisamos de um explícito return
).
foo <- function(formula,data,...){
print(head(data))
x<-match.call()
x[[1]]<-quote(lm)
eval.parent(x)
}
Se você quiser adicionar argumentos à chamada LM, pode fazer assim:
x$na.action <- 'na.exclude'
Se você quiser soltar argumentos para foo antes de ligar para LM, você pode fazer isso assim
x$useless <- NULL
A propósito, geom_smooth
e stat_smooth
Passe quaisquer argumentos extras para a função de suavização, para que você não precise criar uma função própria se precisar definir alguns argumentos extras
qplot(data=diamonds, carat, price, facets=~clarity) +
stat_smooth(method="loess",span=0.5)