No. If your ouput is a numeric "matrix", it cannot include alpha. Columns in a data frame can be of different classes, but each column must be single class.
and finally, of course, see ?cat -- I think you are misusing it. If you simply want to return "somestuff", your function should be: function(w) {"somestuff"} not function(w) {cat("somestuff")} As usual, apologies if I have misunderstood. Caveat emptor. Cheers, Bert Bert Gunter "The trouble with having an open mind is that people keep coming along and sticking things into it." -- Opus (aka Berkeley Breathed in his "Bloom County" comic strip ) On Tue, May 22, 2018 at 1:11 PM, Bailey Hewitt <bails...@hotmail.com> wrote: > Data and code as promised: > > #Creating a test dataset > Year<- c(2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, > 2011, 2012, 2013, 2014) > Lake1<- c(2, 4, 5, 2, 1, 1, 2, 3, 4, 5, 6, 2, 3, 1, 2) > Lake2<- c(1, 3, -1, 4, -2, 1, 2, 3, 4, 5, 6, 2, 3, 1, 2) > Lake3<- c(1, 2, 5, -3, 1, 1, 2, 3, 4, 5, 6, 2, 3, 1, 2) > Lake4<- c(1, 1, 1, 1, 1, 1, 1, 250, 240, 240, 240, 240, 240, 239, 255) > mydata<- data.frame(Year, Lake1, Lake2, Lake3, Lake4) > > #Running a for loop that indicates when an error or warning occurs > y<- mydata[,2:5] > year <- mydata$Year > regimeshift <- data.frame() > for (i in 1:4){ > tryCatch({ > y.val <- y[,i] > lin.reg <- lm(y.val~year, mydata) > seg.reg <- segmented.lm(lin.reg, seg.Z = ~ year, psi = NA, control = > seg.control(stop.if.error = FALSE, n.boot = 0, it.max = 20)) > RSyear <- summary(seg.reg)$psi [1,2] > SlopeRegime1 <- summary(seg.reg)$coefficients[2,1] > SlopeDiff <- summary(seg.reg)$coefficients[3,1] > new.regimeshift <- data.frame(RSyear=RSyear, > SlopeRegime1=SlopeRegime1, SlopeDiff=SlopeDiff) > rownames(new.regimeshift) <- colnames(y)[i] > regimeshift <- rbind(regimeshift,new.regimeshift) > print(regimeshift) > }, error= function(e) {cat("Error", "\n")}, > warning= function(w) {cat("Warning", "\n")}) > } > > Bailey > > > > > From: Daniel Nordlund <djnordl...@gmail.com> > Sent: May 22, 2018 3:06 PM > To: Bailey Hewitt; Bert Gunter > Cc: r-help@R-project.org > Subject: Re: [R] Using tryCatch in a for loop > > > On 5/22/2018 11:32 AM, Bailey Hewitt wrote: > > Hi Bert, > > > > Thank you for the quick response! > > > > In its current state the code prints three lines that say "warning". > What I was expecting is that I would get a matrix with 4 columns, 1. column > names (from the original data, ex. Lake1) 2. breakpoint year 3. slope 4. > slope difference from the first to the second segment of the segmented > regression. Each row in the matrix would be the results of the segmented > regression test for each lake in the original data frame, so Lake1 results > would be in row 2 (row 1 would be titles) and so on. If any of this is > confusing please let me know and I will clarify! > > > > Thanks! > > > > Bailey > > > > > > > > > > From: Bert Gunter <bgunter.4...@gmail.com> > > Sent: May 22, 2018 2:13 PM > > To: Bailey Hewitt > > Cc: r-help@R-project.org > > Subject: Re: [R] Using tryCatch in a for loop > > > > > > > > > > Others may have greater insight, but my response is: Exactly what did or > didn't happen that makes you say the code didn't work? That is, what did or > didn't you get when you ran it compared to your expectations? > > > > Cheers, > > Bert > > > > > > > > > > > > > > Bert Gunter > > > > "The trouble with having an open mind is that people keep coming along > and sticking things into it." > > -- Opus (aka Berkeley Breathed in his "Bloom County" comic strip ) > > > > > > On Tue, May 22, 2018 at 10:55 AM, Bailey Hewitt <bails...@hotmail.com> > wrote: > > Hello All, > > > > I have been trying to use a for loop to run segmented regressions > (from R package segmented) on many columns of data in a data frame with > the end goal of writing a new file with the following columns: column > title, breakpoint year, slope, and difference in slope. Unfortunately, > when one of the columns doesn't have a breakpoint the code stops and > provides an error or warning. I would like the loop to keep running > regardless of the error/warning but I want it to write that it did > encounter an error or warning. Based on my needs I found that tryCatch > appears to do what I need. I have looked at multiple examples, blogs, etc. > as well as gone over the documentation and Hadley Wickham's document in > Advanced R but I am still a novice when it comes to coding and I am > having a hard time getting the code to work properly. Below is the code I > have developed thus far (with a test dataset as an example): > > > > #Creating a test dataset > > Year<- c(2000, 2001, 2002, 2003, 2004) > > Lake1<- c(2, 4, 5, 2, 1) > > Lake2<- c(1, 3, -1, 4, -2) > > Lake3<- c(1, 2, 5, -3, 1) > > mydata<- data.frame(Year, Lake1, Lake2, Lake3) > > > > #Running a for loop that indicates when an error or warning occurs > > y<- mydata[,2:4] > > year <- mydata$Year > > regimeshift <- data.frame() > > for (i in 1:3){ > > tryCatch({ > > y.val <- y[,i] > > lin.reg <- lm(y.val~year, mydata) > > seg.reg <- segmented.lm(lin.reg, seg.Z = ~ year, psi = NA, control > = seg.control(stop.if.error = FALSE, n.boot = 0, it.max = 20)) > > RSyear <- summary(seg.reg)$psi [1,2] > > SlopeRegime1 <- summary(seg.reg)$coefficients[2,1] > > SlopeDiff <- summary(seg.reg)$coefficients[3,1] > > new.regimeshift <- data.frame(RSyear=RSyear, > SlopeRegime1=SlopeRegime1, SlopeDiff=SlopeDiff) > > rownames(new.regimeshift) <- colnames(y)[i] > > regimeshift <- rbind(regimeshift,new.regimeshift) > > print(regimeshift) > > }, error= function(e) {cat("Error", "\n")}, > > warning= function(w) {cat("Warning", "\n")}) > > } > > > > Any ideas or suggestions you might have are greatly appreciated! > > > > Bailey Hewitt > > PhD Candidate > > York University > > Ontario, Canada > > My suggestion is that you get your code to work on a single iteration > before running in a loop and wrapping the code in tryCatch > > I ran your "set-up" code (before the loop). then extracted your code > from the loop, set i <- 1, and then ran the code. Here is what I got: > > > i <- 1 > > y.val <- y[,i] > > lin.reg <- lm(y.val~year, mydata) > > seg.reg <- segmented.lm(lin.reg, seg.Z = ~ year, psi = NA, > control = seg.control(stop.if.error = FALSE, n.boot = 0, it.max = 20)) > Warning message: > No breakpoint estimated > > RSyear <- summary(seg.reg)$psi [1,2] > > SlopeRegime1 <- summary(seg.reg)$coefficients[2,1] > > SlopeDiff <- summary(seg.reg)$coefficients[3,1] > Error in summary(seg.reg)$coefficients[3, 1] : subscript out of bounds > > new.regimeshift <- data.frame(RSyear=RSyear, > SlopeRegime1=SlopeRegime1, SlopeDiff=SlopeDiff) > Error in data.frame(RSyear = RSyear, SlopeRegime1 = SlopeRegime1, > SlopeDiff = SlopeDiff) : > object 'SlopeDiff' not found > > rownames(new.regimeshift) <- colnames(y)[i] > Error in rownames(new.regimeshift) <- colnames(y)[i] : > object 'new.regimeshift' not found > > regimeshift <- rbind(regimeshift,new.regimeshift) > Error in rbind(regimeshift, new.regimeshift) : > object 'new.regimeshift' not found > > print(regimeshift) > > the immediate problems that show up are > 1. there is no variable psi the summary(seg.reg) object (RSyear is NULL). > 2. the coefficients[] matrix in the summary(seg.reg) object does not > have 3 rows, so you get an error and SlopeDiff is not created. > > You need to correct these problems, and any others, so that your code > runs correctly when there are no data problems. Then you can worry > about trapping errors in the case where there are data problems. > > Hope this is helpful, > > Dan > > -- > Daniel Nordlund > Port Townsend, WA USA > > [[alternative HTML version deleted]] ______________________________________________ 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.