我想在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中无法使用。
答案 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))