2011-06-27 56 views
17

想要创建一个使用ggplot生成图形的函数。为了简单起见,典型的曲线图可以是将参数传递给ggplot

ggplot(car, aes(x=speed, y=dist)) + geom_point() 

我想创建功能是类型

f <- function(DS, x, y) ggplot(DS, aes(x=x, y=y)) + geom_point() 

然而,这将不工作的,因为x和y不是字符串。在以前的SO问题中已经注意到这个问题(例如,this one),但在我看来,没有提供令人满意的答案。如何修改上面的函数使其能够处理任意数据帧?

回答

34

一种解决方案是将x和y作为数据帧DS中列的字符串名称传递。

f <- function(DS, x, y) {  
    ggplot(DS, aes_string(x = x, y = y)) + geom_point() 
} 

,然后调用函数为:

f(cars, "speed", "dist") 

然而,似乎你不希望出现这种情况?你能否提供一个例子说明为什么你需要不同的功能?是否因为你不想在同一个数据框中拥有参数?

+1

美丽。我根本不知道这个选项存在。谢谢。 – gappy

+0

没问题,很高兴我能帮上忙。感谢您接受我的解决方案。 –

+1

知道了,忘记了。重新发现它感谢您的答案。 +1 –

7

我认为这是可能的以下类型的代码,它只生成aes组件。

require(ggplot2) 

DS <- data.frame(speed=rnorm(10), dist=rnorm(10)) 

f <- function(DS, x, y, geom, opts=NULL) { 
    aes <- eval(substitute(aes(x, y), 
    list(x = substitute(x), y = substitute(y)))) 
    p <- ggplot(DS, aes) + geom + opts 
} 

p <- f(DS, speed, dist, geom_point()) 
p 

但是,它似乎是复杂的方法。

+4

更好的方法是跳过转换为文本,并只构建aes组件:'xName < - substitute(x); yName < - substitute(y); eval(替代(aes(x,y),列表(x = xName,y = yName))) – hadley

+0

谢谢@hadley。我认为这种方法比我的简单。 –

+0

我更新了:代码改进。 –