2010-03-03 11 views
9

je dois modifier le lm (ou éventuellement loess) fonction pour que je puisse l'utiliser dans geom_smooth de ggplot2 (ou stat_smooth).modifier la fonction lm ou loess à utiliser dans le geom_smooth de ggplot2

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 personnalisée lm2 à utiliser comme 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. Quand j'exécute ce code a obtenir l'erreur:

Error in eval(expr, envir, enclos) : 'nthcdr' needs a list to CDR down

Ce que je ne comprends pas très bien. La méthode lm2 fonctionne très bien lorsqu'elle est exécutée en dehors de stat_smooth. J'ai joué avec ça 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 m'est difficile de les déboguer. Honnêtement, je ne comprends pas ce que je devrais mettre dans l'appel return().

Répondre

6

Il y a une certaine bizarrerie à utiliser ... comme argument dans un appel de fonction que je ne comprends pas complètement (cela a quelque chose à voir avec ... étant un objet de type liste).

Voici une version qui fonctionne en prenant l'appel de la fonction en tant qu'objet, en définissant la fonction appelée à lm, puis en évaluant l'appel dans le contexte de notre propre appelant. Le résultat de cette évaluation est notre valeur de retour (dans R la valeur de la dernière expression dans une fonction est la valeur renvoyée, donc nous n'avons 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 ce

x$useless <- NULL 

Par ailleurs, geom_smooth et stat_smooth passer des arguments supplémentaires à la fonction de lissage, de sorte que vous pas besoin de créer une fonction de votre propre si vous avez besoin de mettre un peu un supplémentaire rguments

qplot(data=diamonds, carat, price, facets=~clarity) + 
    stat_smooth(method="loess",span=0.5) 
+0

Merci! bonne réponse, mon problème était que je ne savais pas que je devais appeler le match.call et comment l'utiliser. Ce que je voulais vraiment faire, c'est ignorer l'évaluation de lm pour les jeux de données avec trop peu de points (cela peut arriver lorsque vous faites des facettes, voir http://groups.google.com/group/ggplot2/browse_thread/thread/df6da9d72f0a1dbf#) mais je voulais voir un cas général. – dalloliogm

+0

Finalement, j'ai résolu mon problème en le signalant à l'auteur de ggplot2 et en attendant qu'il le répare. – dalloliogm