[R] The try() function with read.delim().

Martin Maechler
Wed, 14 May 2008 08:27:13 -0000

>>>>> "RT" == Rolf Turner <r.turner at
auckland.ac.nz>
>>>>>     on Wed, 14 May 2008 13:12:02 +1200 writes:

    RT> I have written a function which reads data from files using
read.delim
    RT> ().
    RT> The names of these files are complicated and are built using
arguments
    RT> to the wrapper function.  Since the files in question may or may not
    RT> exist, I thought to enclose the read.delim() call in a try():

    RT> file <- <complicated expression>
    RT> temp <- try(read.delim(file))
    RT> if(inherits(temp,"try-error")) {
    RT>   (Do something)
    RT> } else {
    RT>    (Do something else)
    RT> }

    RT> But this doesn't work.  If file doesn't exist, then I get an
error,

You get an error *message* but not an error, I'd think.

If you don't like the error *message* in this case, use

 try(..., silent=TRUE)

In R,  try() is now using tryCatch(), (type 'try' to see)
and I would nowadays recommend using tryCatch() inside any function.
Another "advantage" of tryCatch(.) for you is that you can
decide yourself what to do with the error message.

The most simple thing would be something like

	  if(is.null(tryCatch(temp <- read.delim(file),
			      error = function(e) NULL))) {
             ## error reading ...
	  } else {
	     ## work with the 'temp' data frame
          }

Slightly more sophisticated

 	  temp <- tryCatch(read.delim(file), error = function(e) e)
	  if(inherits(e, "error") {
	     message("Caught error:", e at message, "\n")
             ## error reading ...
	  } else {
	     ## work with the 'temp' data frame
          }


*However*, there's a small infelicity in the above:

You get an additional warning from file(..)  which you need to
suppress by another  suppressWarnings( ..... )
around the call.

Martin

    RT> and the wrapper function terminates, despite the presence of the
try().
    RT> The object ``temp'' never gets created.

    RT> I can of course easily get around the problem by testing with

    RT> file.exists(file)

    RT> I just wondered --- why isn't try() working as expected here?  Am
I
    RT> being
    RT> silly to expect it to work?  If so, what am I not understanding about
    RT> try()?

    RT> Thanks for any insights.

    RT> cheers,

    RT> Rolf

    RT>
######################################################################
    RT> Attention:\ This e-mail message is privileged and
confid...{{dropped:9}}

    RT> ______________________________________________
    RT> R-help at r-project.org mailing list
    RT> https://stat.ethz.ch/mailman/listinfo/r-help
    RT> PLEASE do read the posting guide
http://www.R-project.org/posting-guide.html
    RT> and provide commented, minimal, self-contained, reproducible code.