2010-03-03 75 views
9

中使用它,我需要修改lm(或最終loess)功能,這樣我就可以在GGPLOT2的geom_smooth(或stat_smooth)使用它。修改LM或黃土功能GGPLOT2的geom_smooth

例如,這是多麼stat_smooth正常使用:

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

我想自定義一個lm2功能stat_smooth的價值要用於method參數,這樣我就可以自定義其行爲。

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

注意,我在stat_smooth使用method='lm2'作爲參數。 當我執行這個代碼得到錯誤:

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

我不很瞭解。在stat_smooth之外運行時,lm2方法運行良好。我玩了這一點,並且出現了不同類型的錯誤,但是由於我不熟悉R的調試工具,所以我很難調試它們。老實說,我沒有得到我應該在return()的呼叫。

回答

6

使用...作爲函數調用中的一個參數,我並不完全理解(它與...作爲列表類型對象有關)有一些奇怪之處。

這是一個通過將函數調用作爲對象,設置要調用lm的函數,然後在我們自己的調用者的上下文中計算調用的版本。評估的結果是我們的返回值(在R中,函數中最後一個表達式的值是返回的值,所以我們不需要明確的return)。

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

如果你想參數添加到LM電話,你可以做這樣的:

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

如果你想刪除的參數爲foo調用LM之前,你可以不喜歡它這

x$useless <- NULL 

順便說一句,geom_smoothstat_smooth傳遞任何額外的參數,以平滑功能,所以你不必創建自己的功能,如果你只需要設置一些額外的一參數

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

謝謝!很好的答案,我的問題是,我不知道我必須調用match.call以及如何使用它。我真正想要做的就是跳過對點數太少的數據集的lm評估(這可能會在您做出方面時發生,請參閱http://groups.google.com/group/ggplot2/browse_thread/thread/df6da9d72f0a1dbf#)但我想看一個一般情況。 – dalloliogm

+0

最後,我通過向ggplot2的作者報告並等待他解決問題來解決我的問題。 – dalloliogm