2013-07-19 75 views
4

考慮以下兩個功能:函數ggplot:什麼時候它不識別參數,什麼時候它?

library(ggplot2) 

testdata <- as.data.frame(cbind(rep(c(1, 4), each = 50), rbinom(100, 50, .5))) 
names(testdata) <- c("group", "value") 

plotfun1 <- function(color) { 
    ggplot(data = testdata, aes(x = factor(group, levels = c(0: 4)), y = value)) + 
    geom_boxplot(color = color) 
} 

plotfun2 <- function(number) { 
    ggplot(data = testdata, aes(x = factor(group, levels = c(0: number)), y = value)) + 
    geom_boxplot(color = 'red') 
} 

Plotfun1完美的作品,呼籲

plotfun1('red') 

產生了兩個漂亮的紅盒形圖。然而主叫

plotfun2(4) 

產生了錯誤消息:

出錯因子(組,水平= C(0:數)):對象 '編號' 未找到

顯然在某些情況下ggplot是無法「找到」函數的參數,在某些情況下也是如此。這裏發生了什麼?

PS我知道有一個簡單的解決辦法:打印時

plotfun3 <- function(number) { 
    plotdata <- testdata 
    plotdata$group <- factor(plotdata$group, levels = c(0: number)) 
    ggplot(data = plotdata, aes(x = group, y = value)) + 
    geom_boxplot(color = 'red') 
} 

我只是想了解是怎麼回事)

+1

與http://stackoverflow.com/q/5106782/946850類似,但不是重複的。 – krlmlr

+0

啊是的我發現這個時只發現了其他問題。顯然,這些函數之間的區別在於,在plotfun1中我們稱aes中的參數? – Vincent

+0

是的,這可能是原因,但原因在於'ggplot'的內部。 – krlmlr

回答

8

捕捉當地的環境和使用它:

plotfun2 <- function(number) { 
localenv <- environment() 
    ggplot(data = testdata, aes(x = factor(group, levels = c(0:number)), y = value), environment = localenv) + 
    geom_boxplot(color = 'red') 
} 

plotfun2(4) 
+0

不錯!是否有可能把它作爲一個函數來包裝,比如'ggplot.local',其中一切都「正常工作」? – krlmlr

+0

這可以非常有用,謝謝! – Vincent

相關問題