Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Displaying warnings generated by R script as they happen

Tags:

r

I have a script that contains multiple blocks with lines that look like this...

#Read data for X
DataX = read.delim(file = 'XRecords.txt',
                   col.names = XFields[,'FieldName'])
print('Data X read')
#Convert fields that should be numeric into numeric so they can summed
DataX[,NumFieldNames] = as.numeric(as.character(XData[,NumFieldNames]))
print('Data X scrubbed')

When I source the script I get an output like this...

[1] "Data X read"
[1] "Data X scrubbed"
[1] "Data Y read"
[1] "Data Y scrubbed"
Warning message:
In eval(expr, envir, enclos) : NAs introduced by coercion

Based on that output, I reload data Y and began looking for records where the string to numeric conversion failed. After a couple hours of frustration, I realized that data X was actually the one that had type conversion errors.

It looks like what's happening is that an warning is raised, but it does not display on the console until the script finishes. Is there a way to make warnings output to the console as soon as they are raised? I tried flush.console(), but it doesn't seem to work for warnings.

I'd prefer not to have load any additional packages onto my system if it can be avoided. I'm using this for work, and I had to jump through a few hoops just to get the CRAN distribution installed on my computer.

Thank you. I appreciate the help.

like image 744
Adam Hoelscher Avatar asked Mar 15 '13 18:03

Adam Hoelscher


1 Answers

Let's make an example that shows the problem

foo <- function() {
  X <- c("1", "2", "three")
  print("Data X read")
  X <- as.numeric(X)
  print("Data X scrubbed")
  Y <- c("1", "2", "3")
  print("Data Y read")
  Y <- as.numeric(Y)
  print("Data Y scrubbed")
}

If run (even interactively), the behavior you see appears

> foo()
[1] "Data X read"
[1] "Data X scrubbed"
[1] "Data Y read"
[1] "Data Y scrubbed"
Warning message:
In foo() : NAs introduced by coercion

Behavior of warnings is handled with the warn option (see help("options")). That gives the choices including

If warn is one, warnings are printed as they occur.

Changing the option to 1 then gives

> options(warn=1)
> foo()
[1] "Data X read"
Warning in foo() : NAs introduced by coercion
[1] "Data X scrubbed"
[1] "Data Y read"
[1] "Data Y scrubbed"
like image 78
Brian Diggs Avatar answered Oct 23 '22 16:10

Brian Diggs