Я пытаюсь работать с R через Java-программу. Я сначала немного поработал с JRI, однако тот факт, что вы должны сделать все, что вам нужно в R, прежде чем вернуться к своей программе Java, заставил меня взглянуть на Rserve.Взаимодействие с R через программы Java
У меня, похоже, проблема с Rserve. Я прикрепил RserveTool, который я написал, и пытаюсь использовать его в основном методе для его проверки.
import java.io.File;
import java.io.IOException;
import org.rosuda.REngine.REXP;
import org.rosuda.REngine.REXPMismatchException;
import org.rosuda.REngine.Rserve.RConnection;
import org.rosuda.REngine.Rserve.RserveException;
public class RserveTool {
private RConnection _r;
private Process _p;
public RserveTool() {
System.out.println("Creating R Connection.");
_p = null;
try {
_p = Runtime.getRuntime().exec("Rserve.exe", null, new File("C:\\Program Files\\R\\R-3.0.2\\bin\\x64\\"));
} catch (IOException e) {
e.printStackTrace();
}
try {
_r = new RConnection();
REXP x = _r.eval("R.version.string");
System.out.println("Connection built to: " + x.asString());
} catch (RserveException e) {
e.printStackTrace();
} catch (REXPMismatchException e) {
e.printStackTrace();
}
}
public void endRserveProcess() {
_p.destroy();
}
public REXP readInCSVData(File csvFile, String dataVariableName, boolean isHeaderInData) throws RserveException {
String fileLocation = csvFile.getAbsolutePath();
return _r.eval(dataVariableName + "<-read.csv('"+fileLocation+"', header=" +String.valueOf(isHeaderInData).toUpperCase() + ")");
}
public REXP evalData(String dataVariableName) throws RserveException {
return _r.eval(dataVariableName);
}
public REXP attachData(String dataVariableName) throws RserveException {
return _r.eval("attach("+dataVariableName+")");
}
public REXP runMultiLinearRegression(String responseVariableName, String[] variablesToRegressUpon, String dataVariableName) throws RserveException {
String insidelm = responseVariableName;
for(int i=0; i<variablesToRegressUpon.length; i++) {
if(i==0) {
insidelm+="~";
} else {
insidelm+="+";
}
insidelm+=variablesToRegressUpon[i];
}
insidelm+=", data = " + dataVariableName;
return _r.eval("results=lm("+insidelm+")");
}
public REXP runSummaryOfMultiLinearRegression() throws RserveException {
return _r.eval("summary(results)");
}
public double[] getPValuesFromRegression(int numTermsRun) throws RserveException {
REXP p = _r.eval("summary(results)");
System.out.println(p);
double[] pValues = new double[numTermsRun+1];
// for(int i=0; i<p.asVector().getNames().size(); i++) {
// if(p.asVector().getNames().get(i).equals("coefficients")) {
// REXP results = (REXP) p.asVector().get(i);
// System.out.println(p.asVector().get(i));
// for(int j=0; j<=numTermsRun; j++) {
// pValues[j] = results.asDoubleArray()[3*(numTermsRun+1)+j];
// }
// }
// }
return pValues;
}
}
Я получил следующее исключение.
java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:189)
at java.net.SocketInputStream.read(SocketInputStream.java:121)
at java.net.SocketInputStream.read(SocketInputStream.java:107)
at org.rosuda.REngine.Rserve.protocol.RTalk.request(RTalk.java:213)
at org.rosuda.REngine.Rserve.protocol.RTalk.request(RTalk.java:180)
at org.rosuda.REngine.Rserve.protocol.RTalk.request(RTalk.java:250)
at org.rosuda.REngine.Rserve.RConnection.eval(RConnection.java:231)
org.rosuda.REngine.Rserve.RserveException: eval failed
at org.rosuda.REngine.Rserve.RConnection.eval(RConnection.java:234)
Любая помощь вообще была бы очень признательна. Извините за проблемы с форматированием, я новичок!
'_p.waitFor()', прежде чем пытаться Eval что-нибудь? У вас есть довольно полезная оболочка с именем [Rsession] (http://code.google.com/p/rsession/), которая может помочь сделать это безопасно и с хорошей осторожностью в случае Windows (эта устаревшая ОС не может обрабатывать процессы) Взгляните или вдохновляйтесь функцией 'newInstanceTry (...)'. –