[Rd] Fetching Warning Messages
Nikhil Shah
n.shah at decisioncraft.com
Mon Aug 22 17:26:59 CEST 2005
Hi,
I am facing one problem of fetching R warning messages in Java Code
using Rserve. It is easier to trap R Error messages by using catching
RSrvException. I came to know one way of fetching R Warning messages, i.e.
using "withCallingHandlers", below is my Java Program, which uses
withCallingHandlers of R :
import org.rosuda.JRclient.*;
---------------------------RWarning.java-----------------------
class RWarning
{
public static void main(String args[])
{
try
{
String hostName = null;
hostName = args[0];
Rconnection c = new Rconnection(hostName);
c.voidEval("lastWarning <- NULL");
c.voidEval("withCallingHandlers(
{x<-sqrt(-9);y<-matrix(1:9,ncol=4);z<-sqrt(4)} , warning = function (w) {
lastWarning <<- paste(lastWarning,as.character(w))})"); //This will generate
warning message[sqrt(-9)], another warning message [ matrix(1:9,ncol=4) ]
and successful completion [ sqrt(4) ]
System.out.println(c.eval("z").asDouble());
System.out.println(c.eval("lastWarning").asString());
c.close();
System.out.println("DONE");
}
catch(RSrvException e)
{
System.out.println("Error : " + e.getMessage());
e.printStackTrace();
}
}
}
---------------------------End Of RWarning.java-----------------------
Output of above program is (as expected) :
2.0
simpleWarning in sqrt(-9): NaNs produced
simpleWarning: data length [9] is not a sub-multiple or multiple of the
number of columns [4] in matrix
DONE
Now my query is that if there is any way of using warnings() function
in Java Program to fetch all warnings. I used it in my program but returns
me NULL instead of warning messages. I also used last.warning but it Java
Program gives an error saying that last.warning object is not found. I have
pasted both the java code below :
This is the java program that I have written to use "last.warning" object of
R. Please explain me where the error could be.
------------Code of RWarning1.java----------------
import org.rosuda.JRclient.*;
class RWarning1
{
public static void main(String args[])
{
try
{
String hostName = null;
hostName = args[0];
Rconnection c = new Rconnection(hostName);
System.out.println(c.eval("x<-sqrt(-9)").asString());
System.out.println(c.eval("last.warning").asString());
c.close();
System.out.println("DONE");
}
catch(RSrvException e)
{
System.out.println("Error : " + e.getMessage());
e.printStackTrace();
}
}
}
------------End of code of RWarning1.java------------------
output of RWarning1.class
null
Error : Request return code: 127 [request status: Error (127)]
org.rosuda.JRclient.RSrvException: Request return code: 127 [request status:
Err
or (127)]
at org.rosuda.JRclient.Rconnection.eval(Rconnection.java:190)
at RWarning.main(RWarning.java:13)
In other words, when I use "last.warning" in eval method, I simply get an
exception, instead of value of last.warning.
Below is the java code of using warnings() function.
------------Code of RWarning2.java----------------
import org.rosuda.JRclient.*;
class RWarning2
{
public static void main(String args[])
{
try
{
String hostName = null;
hostName = args[0];
Rconnection c = new Rconnection(hostName);
System.out.println(c.eval("x<-sqrt(-9)").asString());
System.out.println(c.eval("paste(capture.output(warnings()),collapse='\n')")
.asString());
c.close();
System.out.println("DONE");
}
catch(RSrvException e)
{
System.out.println("Error : " + e.getMessage());
e.printStackTrace();
}
}
}
------------End of code of RWarning2.java------------------
output of RWarning2.class
null
NULL
DONE
Please let me know where I am making mistake.
Regards,
Nikhil Shah
More information about the R-devel
mailing list