2016-10-26 159 views
2

我想參數化ggplot2繪圖創建的一系列函數以減少冗餘。下面我有它沒有參數化函數的樣子(和工作),我嘗試這樣做。使參數化函數返回一個函數來評估

我試圖捕獲和傳遞參數值在功能markvline()geom_vline()geom_text(),但我想打電話給markvline()內嵌在qplot()功能並返回geom_vline() + geom_text()作爲參數,使他們能夠得到評估,並做與第一部分所做的相同。

我假設我需要理解quote/eval /替代一點點,但我不會在這一點上。任何幫助表示讚賞,我將如何構造markvline()等同於調用geom_vline() + geom_text(),並填寫參數。

library(ggplot2) 

    ## This works 
    ## Making labeled vertical lines at 5 and 6 
qplot(Sepal.Length, Sepal.Width, data=iris) + 
    geom_vline(xintercept=5, color="red", size=1) + 
    geom_text(x=5, y=4, label="5", hjust=0) + 
    geom_vline(xintercept=6, color="red", size=1) + 
    geom_text(x=6, y=4, label="6", hjust=0) 


    ## I would like to parameterize these two statements 
markvline <- function(e) { 
    geom_vline(xintercept=e, color="red", size=1) + 
    geom_text(x=e, y=4, label=as.character(e), hjust=0)} 

    ## ... but this does not work 
qplot(Sepal.Length, Sepal.Width, data=iris) + 
    markvline(5) + 
    markvline(6) 

回答

1

我能夠做的最好的是:

markvline <- function(e) { 
    list(geom_vline(xintercept=e, color="red", size=1), 
     geom_text(x=e, y=4, label=as.character(e), hjust=0))} 

qplot(Sepal.Length, Sepal.Width, data=iris) + 
    markvline(5) + markvline(6) 
+1

列表是不錯的選擇,但你並不需要獨立添加元素,只是'qplot(Sepal.Length,萼片。寬度,數據=虹膜)+ markvline(5)+ markvline(6)' – HubertL

+1

謝謝!這個告訴我的事情之一(以及我的例子中返回的一些錯誤代碼)是我可以按照評估返回單個函數(列表爲你),但是我不能*將它們與'+ '在我的功能裏面。這暗示'geom_vline()'和'geom_text()'不會與'+'單獨相互結合,但需要摺疊到'qplot()'返回的任何對象中。這是一個很好的領導! – mpettis

+0

謝謝。這比我想象的要容易。我將編輯我的答案 –