[R] Using tryCatch in a for loop

Bert Gunter bgunter@4567 @ending from gm@il@com
Tue May 22 22:42:01 CEST 2018


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 <bailster at 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 <djnordlund at gmail.com>
> Sent: May 22, 2018 3:06 PM
> To: Bailey Hewitt; Bert Gunter
> Cc: r-help at 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.4567 at gmail.com>
> > Sent: May 22, 2018 2:13 PM
> > To: Bailey Hewitt
> > Cc: r-help at 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  <bailster at 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]]



More information about the R-help mailing list