2016-10-26 112 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

谢谢。这比我想象的要容易。我将编辑我的答案 –