jcrosbie
2015-Feb-19 22:28 UTC
[R] Custom function causing an error with returning a ggplot object and Error in eval(expr, envir, enclos) : object '...' not found
I'm trying to create a custom function to return a chart object. This function seems to be having an error with calculating min/max/etc in the ggplot object. If I run the code for the ggplot not inside a custom function it works. To reproduce this error after I need to clear the memory with (rm(list ls())) and reload the function and data. How can I change my function to work correctly? Sample data: Date<-seq(as.Date("2000/1/1"), by = "week", length.out = 53*4) ThousandBarrelsADay<-sample(1:1000, 53*4, replace=F) yAxisTitle<-"Thousand Barrels per Day" titleChart<-"test" Function call: p<-LinePlotTestStatsLine(Date, ThousandBarrelsADay, titleChart, yAxisTitle) Error: p Error in eval(expr, envir, enclos) : object 'MinVal' not found The code for the function: LinePlotTestStatsLine<- function(xDateValues, yValues, titleChart, yAxisTitle) { dfTemp=0 #the sub title outlining the data range subtitleChart = paste("(Data set from ", min(xDateValues), " to ", max(xDateValues), ")", sep="") #create a base dataframe Week<- as.numeric(str_sub(ISOweek(xDateValues),start=-2)) dfTemp<-data.frame(xDateValues, Week, yValues) dfTemp<- dfTemp[order(dfTemp$xDateValues),] #Summary Stat by week dfTemp_Out<-describeBy(dfTemp$yValues, dfTemp$Week, mat = TRUE) colnames(dfTemp_Out)[2]<-"Week" #get the last year's of data Use 53 weeks because some years have 53 weeks tempLast53<- tail(dfTemp, 53-length(dfTemp$yValues)) LableDateMinMax<-tempLast53$xDateValues[13] LableDateMedian<-tempLast53$xDateValues[20] #Chrate a base table for charting ChartData1<-join(dfTemp_Out, tempLast53, type="inner") #make sure the chart table is sorted ChartData1<- ChartData1[order(ChartData1$xDateValues),] #find the max Date MaxDate<- max(dfTemp$xDateValues) maxYR<- max(year(dfTemp$xDateValues)) #min, Median, mean & max for hoizontal lines MinVal<-min(dfTemp$yValues) rMin<-max(which(dfTemp$yValues== MinVal, arr.ind = TRUE)) MinD<- dfTemp$xDateValues[rMin] MaxVal<-max(dfTemp$yValues) rMax<-max(which(dfTemp$yValues== MaxVal, arr.ind = TRUE)) MaxD<- dfTemp$xDateValues[rMax] #Set the chart data ChartData1_Plot <-ChartData1[,c("xDateValues","Week","yValues")] ChartData1_Plot$Statistic<-paste("Past YR at ", MaxDate, sep="") MedianVal<-median(dfTemp$yValues) MeanVal<-mean(dfTemp$yValues) stDev<- sd(dfTemp$yValues) #ribbon to show one st. Dev. Ribbon<-data.frame(ChartData1[,c("xDateValues")]) Ribbon$Lower<-MeanVal-stDev Ribbon$Higher<-MeanVal+stDev colnames(Ribbon)<-c("xDateValues", "Lower", "Higher") Ribbon$mean<-ChartData1$mean #Set the seasons for charting #Spring March 20, 2013 dSpring <- as.Date(paste("03/20/",maxYR, sep=""), "%m/%d/%Y") if (MaxDate<=dSpring) { dSpring <- as.Date(paste("03/20/",maxYR-1, sep=""), "%m/%d/%Y") } #summer June 21, 2013 dSummer<-as.Date(paste("06/21/",maxYR, sep=""), "%m/%d/%Y") if (MaxDate<=dSummer) { dSummer<- as.Date(paste("06/21/",maxYR-1, sep=""), "%m/%d/%Y") } #Autumn September 22, 2013 dAutumn<-as.Date(paste("09/23/",maxYR, sep=""), "%m/%d/%Y") if (MaxDate<=dAutumn) { dAutumn<- as.Date(paste("09/23/",maxYR-1, sep=""), "%m/%d/%Y") } # winter December 21, 2013 dWinter<-as.Date(paste("12/21/",maxYR, sep=""), "%m/%d/%Y") if (MaxDate<=dWinter) { dWinter<- as.Date(paste("12/21/",maxYR-1, sep=""), "%m/%d/%Y") } ChartData_Plot <- ChartData1_Plot p1<-ggplot(ChartData_Plot, aes(x=xDateValues,y=yValues))+ geom_line(aes(group=Statistic, colour=Statistic))+ scale_color_manual(values=c("black"))+ geom_ribbon(data=Ribbon, aes(group = 1, y=mean, x=xDateValues, ymin=Lower, ymax=Higher), alpha=0.1, fill="blue")+ geom_hline(aes(yintercept=MinVal), color="red", linetype="dashed")+ geom_hline(aes(yintercept=MaxVal), color="red", linetype="dashed")+ annotate(geom="text", x = LableDateMinMax, y = MinVal-MaxVal/90, label paste("Min as at ", MinD, sep=""), colour = "red", size = 4)+ annotate(geom="text", x = LableDateMinMax, y = MaxVal+MaxVal/40, label paste("Max as at ", MaxD, sep=""), colour = "red", size = 4)+ geom_hline(aes(yintercept=MedianVal), color="darkgreen", linetype="dashed")+ geom_hline(aes(yintercept=MeanVal), color="blue", linetype="dashed")+ annotate(geom="text", x = LableDateMinMax, y = MeanVal+MaxVal/40, label = paste("Mean", sep=""), colour = "blue", size = 4)+ annotate(geom="text", x = LableDateMedian, y = MedianVal+MaxVal/40, label = paste("Median", sep=""), colour = "darkgreen", size = 4)+ theme(legend.position="bottom")+ geom_vline(xintercept = as.numeric(dSpring),colour="darkgrey")+ geom_vline(xintercept = as.numeric(dSummer),colour="darkgrey")+ geom_vline(xintercept = as.numeric(dAutumn),colour="darkgrey")+ geom_vline(xintercept = as.numeric(dWinter),colour="darkgrey")+ annotate(geom="text", x = c(dWinter+45, dSpring+45, dSummer+45, dAutumn+45), y = MaxVal+MaxVal/10, label = c("Winter", "Spring", "Summer", "Autumn"), colour = "darkgrey", size = 4)+ ggtitle(bquote(atop(.(titleChart), atop(italic(.(subtitleChart)), ""))))+ labs(x = "")+ scale_x_date(breaks="4 weeks",labels = date_format("%b-%Y"))+ scale_y_continuous(labels = comma)+expand_limits(y = 0)+ theme(axis.text.x element_text(size=10,angle=45,colour="black",vjust=1,hjust=1))+ labs(y = yAxisTitle)+ theme(legend.position="none") Footnote<-"Note: Shaded area represents one standard deviation from the mean" #p1<-arrangeGrob(p1, sub = textGrob(Footnote, x = 0, hjust = -0.1, vjust=0.1, gp = gpar(fontface = "italic", fontsize = 10))) return(p1) } -- View this message in context: http://r.789695.n4.nabble.com/Custom-function-causing-an-error-with-returning-a-ggplot-object-and-Error-in-eval-expr-envir-enclos-d-tp4703554.html Sent from the R help mailing list archive at Nabble.com.