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().

Était-ce utile?

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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top