2010-03-03 5 views
9

Ich brauche die lm (oder eventuell loess) zu modifizieren, damit ich es in ggplot2 die Verwendung geom_smooth (oder stat_smooth).lm oder Löss Funktion modifizieren geom_smooth die innerhalb ggplot2 verwenden

Zum Beispiel ist dies, wie stat_smooth normalerweise verwendet wird:

> qplot(data=diamonds, carat, price, facets=~clarity) + stat_smooth(method='lm')` 

Ich möchte eine benutzerdefinierte lm2 Funktion definieren als Wert für den Parameter method in stat_smooth zu verwenden, so kann ich ihr Verhalten anpassen.

> lm2 <- function(formula, data, ...) 
    { 
     print(head(data)) 
     return(lm(formula, data, ...)) 
    } 
> qplot(data=diamonds, carat, price, facets=~clarity) + stat_smooth(method='lm2') 

Bitte beachte, dass ich method='lm2' als Parameter in stat_smooth verwendet haben. Wenn ich diesen Code ausführen, um einen den Fehler:

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

Was ich nicht verstehe sehr gut. Die Methode lm2 funktioniert sehr gut, wenn sie außerhalb von stat_smooth ausgeführt wird. Ich habe damit ein bisschen gespielt und ich habe verschiedene Arten von Fehlern, aber da ich mit den Debug-Tools von R nicht vertraut bin, ist es schwierig für mich, sie zu debuggen. Ehrlich gesagt, bekomme ich nicht, was ich in den return() Anruf setzen sollte.

Antwort

6

Es gibt einige Seltsamkeit in der Verwendung von ... als Argument in einem Funktionsaufruf, die ich nicht vollständig verstehe (es hat etwas damit zu tun, ... ein Listen-Objekt zu sein).

Hier ist eine Version, die funktioniert, indem Sie den Funktionsaufruf als ein Objekt nehmen, die Funktion auf lm setzen und dann den Aufruf im Kontext unseres eigenen Aufrufers auswerten. Das Ergebnis dieser Auswertung ist unser Rückgabewert (in R ist der Wert des letzten Ausdrucks in einer Funktion der zurückgegebene Wert, so dass wir keine explizite return benötigen).

foo <- function(formula,data,...){ 
    print(head(data)) 
    x<-match.call() 
    x[[1]]<-quote(lm) 
    eval.parent(x) 
} 

Wenn Sie Argumente für den Film Anruf hinzufügen möchten, können Sie es wie folgt tun:

x$na.action <- 'na.exclude' 

Wenn Sie Argumente fallen auf foo wollen, bevor Sie lm aufrufen, können Sie es tun, wie passieren diese

x$useless <- NULL 

By the way, geom_smooth und stat_smooth keine zusätzlichen Argumente an die Glättungsfunktion, so müssen Sie eine Funktion des eigenen nicht erstellen, wenn Sie nur etwas mehr ein festlegen müssen rguments

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

Danke !! nette Antwort, mein Problem war, dass ich nicht wusste, dass ich die match.call anrufen musste und wie man sie benutzt. Was ich wirklich tun wollte, ist, die Auswertung von lm für Datasets mit zu wenig Punkten zu überspringen (dies kann passieren, wenn Sie Facetten verwenden, siehe http://groups.google.com/group/ggplot2/browse_thread#thread/df6da9d72f0a1dbf#). aber ich wollte einen allgemeinen Fall sehen. – dalloliogm

+0

Am Ende löste ich mein Problem, indem ich es dem Autor von ggplot2 meldete und darauf wartete, dass er es löste. – dalloliogm

Verwandte Themen