modifier la fonction lm ou loess à utiliser dans la geom_smooth de ggplot2
Question
Je dois modifier le lm
(ou éventuellement loess
) fonction donc je peux l'utiliser dans le geom_smooth
de ggplot2 (ou stat_smooth
).
Par exemple, voici comment stat_smooth
est utilisé normalement:
> qplot(data=diamonds, carat, price, facets=~clarity) + stat_smooth(method='lm')`
Je voudrais définir une fonction lm2
personnalisée à utiliser en tant que valeur du paramètre method
dans stat_smooth
, donc je peux personnaliser son comportement.
> lm2 <- function(formula, data, ...)
{
print(head(data))
return(lm(formula, data, ...))
}
> qplot(data=diamonds, carat, price, facets=~clarity) + stat_smooth(method='lm2')
Notez que je l'ai utilisé method='lm2'
comme paramètre dans stat_smooth
.
Lorsque j'exécute ce code a obtenir l'erreur:
Erreur dans eval (expr, Envir, Enclos): 'nthcdr' a besoin d'une liste CDR vers le bas
Ce que je ne comprends pas très bien. La méthode de lm2
fonctionne très bien lorsqu'il est exécuté en dehors de stat_smooth
. Je jouais avec cela un peu et j'ai différents types d'erreurs, mais comme je ne suis pas à l'aise avec les outils de débogage de R, il est difficile pour moi de les déboguer. Honnêtement, je ne comprends pas ce que je devrais mettre à l'intérieur de l'appel return()
.
La solution
Il y a quelques bizarreries à utiliser ... comme argument dans un appel de fonction que je ne comprends pas bien (il a quelque chose à voir avec ... étant un objet de type liste).
Voici une version qui fonctionne en prenant l'appel de fonction comme un objet, le réglage de la fonction à appeler à lm, puis l'évaluation de l'appel dans le cadre de notre interlocuteur. Le résultat de cette évaluation est notre valeur de retour (en R la valeur de la dernière expression en fonction est la valeur retournée, donc on n'a pas besoin d'un return
explicite).
foo <- function(formula,data,...){
print(head(data))
x<-match.call()
x[[1]]<-quote(lm)
eval.parent(x)
}
Si vous voulez ajouter des arguments à l'appel de film, vous pouvez le faire comme ceci:
x$na.action <- 'na.exclude'
Si vous souhaitez déposer des arguments à foo avant d'appeler lm, vous pouvez le faire comme ceci
x$useless <- NULL
Par ailleurs, geom_smooth
et stat_smooth
passer des arguments supplémentaires à la fonction de lissage, de sorte que vous ne devez pas créer une fonction de votre propre si vous ne devez définir quelques arguments supplémentaires
qplot(data=diamonds, carat, price, facets=~clarity) +
stat_smooth(method="loess",span=0.5)