2015-03-19 59 views
1

我想在r中有一個子程序來計算均值和範圍。因此,它應該返回一個完整的ggplot,它將在main中處理(保存或打印)。如何從一個子類中返回一個ggplot對象?

下面是代碼:

myqcc<-function(messung, sample) 
{ 

require(ggplot2) 
y<-cbind(messung,sample) 
x1<-aggregate(messung~sample,data=y,mean) 
myrange<-aggregate(messung~sample,data=y,range) 
stat<-cbind(x1,"range"=myrange$messung[,2]-myrange$messung[,1]) 
x2<-mean(stat$messung) 
range1<-mean(stat$range) 
A2<-0.577 
D3<-0 
D4<-2.115 
UCLm<-x2+A2*range1 
LCLm<-x2-A2*range1 
UCLr<-range1*D4 
LCLr<-range1*D3 

g1<-ggplot(stat,aes(x=sample,y=messung)) + geom_line() + geom_point() + geom_hline(aes(LCLm), colour="#BB0000", linetype="dashed") +geom_hline(aes(UCLm), colour="#BB0000", linetype="dashed") + ggtitle("X-Bar Chart for current samples") 
return(g1)  
} 
ggsave(myqcc(x,y), file="Stichprobe.jpg", width=9, height=4,dpi=100) 

運行它,結果在 「LCLm無法找到」。

下面是調試輸出:

myqcc<-function(messung, sample) 
+ { 
+ 
+ require(ggplot2) 
+ y<-cbind(messung,sample) 
+ x1<-aggregate(messung~sample,data=y,mean) 
+ myrange<-aggregate(messung~sample,data=y,range) 
+ stat<-cbind(x1,"range"=myrange$messung[,2]-myrange$messung[,1]) 
+ x2<-mean(stat$messung) 
+ range1<-mean(stat$range) 
+ A2<-0.577 
+ D3<-0 
+ D4<-2.115 
+ 
+ UCLm<-x2+A2*range1 
+ LCLm<-x2-A2*range1 
+ UCLr<-range1*D4 
+ LCLr<-range1*D3 
+ 
+ g1<-ggplot(mystat,aes(x=sample,y=messung)) + geom_line() + geom_point() + geom_hline(aes(LCLm), colour="#BB0000", linetype="dashed") +geom_hline(aes(UCLm), colour="#BB0000", linetype="dashed") + ggtitle("X- Bar Chart for current samples") 
+ browser() 
+ return(g1)   
+ } 
> ggsave(myqcc(x,y), file="Stichprobe.jpg", width=9, height=4,dpi=100) 
Called from: myqcc(x, y) 
Browse[1]> LCLm 
[1] 2.970867 
Browse[1]> 
debug bei #22:return(g1) 
Browse[2]> 
Fehler in eval(expr, envir, enclos) : Objekt 'LCLm' nicht gefunden 

正如你所看到的,LCLm被定義並具有價值,但在ggplot不能使用。

回答

2

您沒有提供數據集,因此您的問題並非完全粘貼並運行,但無關緊要。我爲您的geom_hline圖層製作了一個「圖層特定數據集」,它可以做到這一點。我還添加了「yintercept」標籤,看起來更符合reference examples

myqcc<-function(messung, sample) 
{ 

    require(ggplot2) 
    y<-cbind(messung,sample) 
    x1<-aggregate(messung~sample,data=y,mean) 
    myrange<-aggregate(messung~sample,data=y,range) 
    stat<-cbind(x1,"range"=myrange$messung[,2]-myrange$messung[,1]) 
    x2<-mean(stat$messung) 
    range1<-mean(stat$range) 
    A2<-0.577 
    D3<-0 
    D4<-2.115 
    UCLm<-x2+A2*range1 
    LCLm<-x2-A2*range1 
    UCLr<-range1*D4 
    LCLr<-range1*D3 
    layerSpecificDataSet <- data.frame(a=UCLm,b=LCLm) 
    g1<-ggplot(stat,aes(x=sample,y=messung)) + geom_line() + geom_point() + 
    geom_hline(data=layerSpecificDataSet,aes(yintercept=a), colour="#BB0000", linetype="dashed") + 
    geom_hline(data=layerSpecificDataSet,aes(yintercept=b), colour="#BB0000", linetype="dashed") + 
    ggtitle("X-Bar Chart for current samples") 

    return(g1)  
} 

print(myqcc(rnorm(10),rnorm(10))) 

請注意,您可以在兩個HLINE層合併爲一個這樣的:

geom_hline(data=layerSpecificDataSet,aes(yintercept=c(a,b)), colour="#BB0000", linetype="dashed") 
0

ggplot看在數據幀,然後在UCLm全球環境,但它位於既不;它位於函數的環境中。將environment = environment()添加到ggplot()應該可以解決問題。 See here獲得解釋。

myqcc<-function(messung, sample) 
{ 

require(ggplot2) 
y<-cbind(messung,sample) 
x1<-aggregate(messung~sample,data=y,mean) 
myrange<-aggregate(messung~sample,data=y,range) 
stat<-cbind(x1,"range"=myrange$messung[,2]-myrange$messung[,1]) 
x2<-mean(stat$messung) 
range1<-mean(stat$range) 
A2<-0.577 
D3<-0 
D4<-2.115 
UCLm<-x2+A2*range1 
LCLm<-x2-A2*range1 
UCLr<-range1*D4 
LCLr<-range1*D3 

g1<-ggplot(stat,aes(x=sample,y=messung), environment = environment()) + geom_line() + geom_point() + geom_hline(aes(LCLm), colour="#BB0000", linetype="dashed") +geom_hline(aes(UCLm), colour="#BB0000", linetype="dashed") + ggtitle("X-Bar Chart for current samples") 
return(g1)  
} 

myqcc(rnorm(10),rnorm(10))