如何从sub返回ggplot对象?

时间:2015-03-19 12:29:05

标签: r ggplot2

我想在r中有一个子程序来计算平均值和范围。因此,它应该返回一个完整的ggplot,它将在main中处理(保存或打印)。

以下是代码:

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”。

以下是debug的输出:

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 个答案:

答案 0 :(得分: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")

答案 1 :(得分: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))