2014-01-27 2 views
2

Я пытаюсь работать с 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) 

Любая помощь вообще была бы очень признательна. Извините за проблемы с форматированием, я новичок!

+0

'_p.waitFor()', прежде чем пытаться Eval что-нибудь? У вас есть довольно полезная оболочка с именем [Rsession] (http://code.google.com/p/rsession/), которая может помочь сделать это безопасно и с хорошей осторожностью в случае Windows (эта устаревшая ОС не может обрабатывать процессы) Взгляните или вдохновляйтесь функцией 'newInstanceTry (...)'. –

ответ

0

Перед запуском приложения Java. вы попробуйте запустить Rserve первый в R т.е.

1) библиотека ("Rserve") 2) Rserve()

Смежные вопросы