2011-06-27 62 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

我更新了:代碼改進。 –