On Thu, Oct 6, 2022 at 9:44 AM Bill Dunlap <williamwdun...@gmail.com> wrote: > > Here is how you could have made an example that helpers could easily run. > It also includes the fix. > > f <- function(print.it = FALSE) { > pdf(file.pdf <- tempfile(fileext=".pdf")) > series <- as.xts(setNames(sin(seq(0,10,by=.1)), > seq(as.Date("2022-10-06"),by="weeks",len=101))) > p <- plot(series) > if (print.it) { > print(p) > } > sm_series_2 <- smooth(series / 2) > lines(sm_series_2, col="red") > abline(h=0.1, col="blue") > dev.off() > file.pdf > } > > f() > Error in plot.xy(xy.coords(x, y), type = type, ...) : > plot.new has not been called yet > > f(TRUE) > [1] > "C:\\Users\\willi\\AppData\\Local\\Temp\\Rtmp0wX7rO\\file34843df652c.pdf" > > If you remove the pdf() and dev.off() I think you will see that the added > lines do not show up. I think plot.xts fiddles with the coordinate system > before and after it plots so that add-ons must be done in a special way. >
plot.xts() waits until the plot is rendered before calculating the coordinate system. That allows users to add multiple series that have different values for the index (x-axis) and data (y-axis). lines() doesn't show up in your example because it's called after the plot is rendered, and it's not rendered again after they're added. `sm_series_2` also needs to be an xts object, otherwise lines.xts() is not dispatched. title() and abline() need to be called after the plot is rendered because they are standard graphics functions. I admit that's very confusing... I'll see what I can do to fix that. Here's a revised example that works for me: f <- function(print.it = FALSE) { pdf(file.pdf <- tempfile(fileext=".pdf")) series <- xts(sin(seq(0,10,by=.1)), seq(as.Date("2022-10-06"),by="weeks",length.out=101)) p <- plot(series) sm2 <- xts(smooth(series/2), index(series)) lines(sm2, col="red") if (print.it) { print(p) title("Sine curve example") abline(h=0.1, col="green") } dev.off() file.pdf } f(TRUE) > -Bill > > On Thu, Oct 6, 2022 at 12:42 AM Deramus, Thomas Patrick < > tdera...@partners.org> wrote: > > > Hi Rolf. > > > > I followed your suggestion (though it's probably not as trimmed as it > > could be), but the problem unfortunately persists. > > > > Does this make it any clearer or still too many moving parts to make sense > > of? > > > > rm(list = ls(all.names = TRUE)) #will clear all objects includes hidden > > objects. > > > > #Loads the packages > > library(plyr) > > library(dplyr) > > library(ggplot2) > > library(Kendall) > > library(lubridate) > > library(xts) > > library(TTR) > > library(trend) > > library(forecast) > > library(openxlsx) > > > > #Uses the learningCurve Package from Github: > > #https://github.com/AFIT-R/learningCurve > > library(learningCurve) > > > > #Only load this if using VS Studio because it changes the plot function > > # > > https://stackoverflow.com/questions/52284345/how-to-show-r-graph-from-visual-studio-code > > library(httpgd) > > library(languageserver) > > > > #Loads the Excel files to Dataframes and cleans the data > > Game_Metrics_Word_Task <- > > read.xlsx("GamePack_Analytics_ALL_TIME_Short.xlsx", "Boggle") > > Game_Metrics_Word_Task <- Game_Metrics_Word_Task %>% filter(grepl('1440', > > StudyId)) > > Game_Metrics_Word_Task$DeviceTime <- > > ymd_hms(Game_Metrics_Word_Task$DeviceTime, tz = "America/New_York") > > Game_Metrics_Word_Task <- > > Game_Metrics_Word_Task[!duplicated(Game_Metrics_Word_Task[1:2,])] > > > > #Splits the dataframe into a tibble containing each participant > > Participant_Word_Task <- > > split(arrange(Game_Metrics_Word_Task,StudyId,DeviceTime), > > arrange(Game_Metrics_Word_Task,StudyId,DeviceTime,StudyId,DeviceTime)$StudyId) > > > > #Generates a blank output dataframe > > WordFrame <- data.frame(Participant = c(0), Task = c(0), MannKendall_Tau = > > c(0), MannKendall_P = c(0), Sen_Slope_Value = c(0), Sen_Slope_Pval = c(0), > > Pettitts_CIV = c(0), Pettitts_Pval = c(0), ARIMA_Model = c(0), > > Time_to_Petit = c(0), Number_of_Trials_to_Pettitt = c(0), > > Playtime_to_Petit_seconds = c(0), Time_Start_to_end_days = c(0), > > Number_of_Total_Trials = c(0), Total_Playtime_seconds = c(0), > > Learning_rate_days = c(0), Learning_rate_seconds = c(0), Learned_Task = > > c(0)) > > > > #The number of subjects in the xlsx file > > #Reduced to 2 for ease of use > > for (i in 1:2){ > > #This timeseries only includes the trials where the participant > > completed the task > > success_series <- xts(filter(Participant_Word_Task[[i]], GameEndReason > > == "TIMER_UP")$NumberOfSuccesfulWords , > > order.by=as.POSIXct(filter(Participant_Word_Task[[i]], > > GameEndReason == "TIMER_UP")$DeviceTime)) > > #This timeseries includes ALL the trials for the sake of plotting > > original_series <- > > xts(Participant_Word_Task[[i]]$NumberOfSuccesfulWords, order.by > > =as.POSIXct(Participant_Word_Task[[i]]$DeviceTime)) > > > > #This is a decomposing process that xts seems to need for plotting. > > #nweeks is needed for xts to plot the x-axis > > success_decomp <- ts(success_series, frequency = nweeks(success_series)) > > original_decomp <- ts(original_series, frequency = > > nweeks(success_series)) > > > > #Values which will be included in the plots > > WordFrame[i,1] <- unique(Participant_Word_Task[[i]]$StudyId) > > WordFrame[i,5] <- sens.slope(success_decomp)$estimates > > WordFrame[i,6] <- sens.slope(success_decomp)$p.value > > WordFrame[i,7] <- pettitt.test(success_decomp)$estimate > > WordFrame[i,8] <- pettitt.test(success_decomp)$p.value > > > > #The simple moving average that will be overlayed with the plotted data > > simplemovingaverage <- SMA(original_series, n = nweeks(original_series)) > > > > #If the three tests are statistically significant, add a green > > horizontal like to value WordFrame[i,7] > > #Which would be where the slope changes in the series > > #Fluid variables have been removed from all pdf() and paste() functions > > for ease-of-use > > if (WordFrame[i,4] <= 0.05 & WordFrame[i,6] <= 0.05 & WordFrame[i,8] <= > > 0.05){ > > { > > pdf(file = "Word_Task_Acquisition.pdf") > > plout <- plot(original_series) > > lines(simplemovingaverage) > > abline(v = index(original_series[WordFrame[i,7]]),lty=2, > > col='green', lwd=3) > > title(paste("Word Task Acquisition for Subject")) > > dev.off() > > } > > #If the three tests are NOT statistically significant, generate a plot > > with NO horizontal line at WordFrame[i,7] > > } else { > > { > > pdf(file = "Word_Task_Acquisition.pdf") > > plout <- plot(original_series) > > lines(simplemovingaverage) > > title(paste("Word Task Acquisition for Subject")) > > dev.off() > > } > > } > > } > > > > ________________________________ > > From: Rolf Turner <r.tur...@auckland.ac.nz> > > Sent: Wednesday, October 5, 2022 6:06 AM > > To: Deramus, Thomas Patrick <tdera...@partners.org> > > Cc: r-help@r-project.org <r-help@r-project.org> > > Subject: Re: [R] Getting "Error in ect, plot.new has not been called yet" > > despite grouping plot call > > > > External Email - Use Caution > > > > What you doing or trying to do is far too complex for my poor feeble > > and senile brain to come anywhere near comprehending. The code that > > you present exceeds my complexity tolerance by many orders of magnitude. > > > > I have a suggestion, but. Strip your code down to the *essentials*. > > Construct a simple sequence of plotting commands, with *simple* names > > for the pdf files involved. You should require only two or three such > > files and two or three index levels associated with each of your > > nested loops. > > > > Run the stripped down code and the source of the problem will almost > > surely become clear. > > > > cheers, > > > > Rolf Turner > > > > On Tue, 4 Oct 2022 23:35:09 +0000 > > "Deramus, Thomas Patrick" <tdera...@partners.org> wrote: > > <snip> > > > —Issac Asimov > > > > The information in this e-mail is intended only for th...{{dropped:22}} > > ______________________________________________ > R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. -- Joshua Ulrich | about.me/joshuaulrich FOSS Trading | www.fosstrading.com ______________________________________________ R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.