2016-10-07 1 views
0

를 사용하여 여러 줄의 R 스크립트를 실행합니다. 나는 단순한 "hello world"스크립트를 실행하고 단 한 줄의 문장을 유지하는 한 간단한 분석을 수행하는 데 성공했다.내가 평가할 수있는 방법/내가 <strong>rjava의</strong><code>Rengine.eval()</code> 방법을 사용하여 <strong>자바</strong> 내에서 <strong>R</strong>를 호출 실험하고 rjava

그러나 여러 줄의 명령문 (예 : 함수 정의 할당)을 실행하려고하면 일관된 방법으로 작동하지 않습니다.

이 Devoxx 비디오의 발표자에 따르면 : youtube video (36:52 마크에서) 각 스크립트를 개별적으로 평가하여 다중 스크립트를 실행할 수 있습니다. 그가 전술 한 순간에 그가 슬라이드에 보여준 코드 샘플을 잘못 해석하지 않는다면 말입니다. 그 접근 방식은 저를 실패 이후, 나는 작업 방식을 표시하지 않는 단위 테스트를 작성했습니다

은 ...

은 더 많은 경험을 가진 사람이 그들의 빛이 있나? 각 테스트 케이스의 동작은 주석에 포함됩니다. (아래의 코드 블록)

어떤 도움이 크게 I 대신 rJava의 Rserve를 사용할 것을 제안 KR

시몬

import org.junit.Test; 
import org.rosuda.JRI.RMainLoopCallbacks; 
import org.rosuda.JRI.Rengine; 

public class RJavaSanityCheck { 

    private static Rengine engine; 


    @Test 
    public void singleStatementMultiLinesMultiEval(){ 
     Rengine engine = getEngine(); 
     engine.eval("myfunc <- function(x){"); 
     engine.eval("z <- x"); 
     engine.eval("return (x)"); 
     engine.eval("}"); 
     engine.eval("print(myfunc(1))"); 

     //FAIL: Throws two errors: 
     // Error: object 'x' not found 
     // Error in print(myfunc(1)) : could not find function "myfunc" 
    } 

    @Test 
    public void singleStatementMultiLinesSingleEvalWindows(){ 
     Rengine engine = getEngine(); 
     engine.eval("myfunc <- function(x){\r\nz <- x\r\nreturn(x)\r\n}\r\n"); 
     engine.eval("print(myfunc(1))"); 
     engine.end(); 

     //FAIL: Prints nothing and throws an error: 
     // Error in print(myfunc(1)) : could not find function "myfunc" 
    } 

    @Test 
    public void singleStatementMultiLinesSingleEvalLinux(){ 
     Rengine engine = getEngine(); 
     engine.eval("myfunc <- function(x){\nz <- x\nreturn(x)\n}"); 
     engine.eval("print(myfunc(1))"); 
     engine.end(); 

     //SUCCESS: Prints 1 
    } 

    @Test 
    public void multiStatementsMultiLineSingleEvalLinux(){ 
     Rengine engine = getEngine(); 
     engine.eval("print(\"Hello\")\nprint(\"World!\")"); 
     engine.end(); 

     //FAIL: Prints "hello" but not "world!" 
    } 

    @Test 
    public void multiStatementsMultiLineSingleEvalWindows(){ 
     Rengine engine = getEngine(); 
     engine.eval("print(\"Hello\")\r\nprint(\"World!\")"); 
     engine.end(); 

     //FAIL: Prints nothing 
    } 

    @Test 
    public void MultiStatementsMultiEval(){ 
     Rengine engine = getEngine(); 
     engine.eval("print(\"Hello\")"); 
     engine.eval("print(\"World!\")"); 
     engine.end(); 

     //SUCCESS: Prints Hello World! 
    } 


    private static Rengine getEngine(){ 
     if (engine == null){ 
      if (!Rengine.versionCheck()){ 
       throw new RuntimeException("Version mismatch!"); 
      } 
      engine = new Rengine(new String[]{"--vanilla"}, false, new RMainLoopCallbacks() { 
       @Override 
       public void rWriteConsole(Rengine rengine, String s, int i) { 
        System.out.println(s); 
       } 

       @Override 
       public void rBusy(Rengine rengine, int i) { 
        //Not implemented 
       } 

       @Override 
       public String rReadConsole(Rengine rengine, String s, int i) { 
        //Not implemented 
        return null; 
       } 

       @Override 
       public void rShowMessage(Rengine rengine, String s) { 
        System.out.println(s); 
       } 

       @Override 
       public String rChooseFile(Rengine rengine, int i) { 
        //Not implemented 
        return null; 
       } 

       @Override 
       public void rFlushConsole(Rengine rengine) { 
        //Not implemented 
       } 

       @Override 
       public void rSaveHistory(Rengine rengine, String s) { 
        //Not implemented 
       } 

       @Override 
       public void rLoadHistory(Rengine rengine, String s) { 
        //Not implemented 
       } 
      }); 
      if (!engine.waitForR()){ 
       throw new RuntimeException("Loading error!"); 
      } 
     } 
     return engine; 
    } 
} 
+0

R, 그래서 만약 당신이 모든'\ n'을';'로 바꾸고 그것을 하나의 긴 문자열에 넣으면 작동 할 것이라고 생각합니다. – alistaire

+0

의견을 보내 주셔서 감사합니다. 불행하게도'engine.eval ("print (\"Hello \ "); print (\"World! \ ")");만이 "Hello"를 출력합니다. – Skifozoa

답변

0

을 알 수있다.

나는 내 작업에서 구현하고 rServe를 사용하여 내 문제를 해결했습니다.

rserve의 추가 구현은 첨부 된 링크에 있습니다. 내가 함께 할 수 있도록 (하지만 가장 우아한 해결책이 아니다) 순간

Integrating R with Java

+0

제안 해 주셔서 감사합니다. rJava 대신 rServe를 사용할 때 이점이 분명히 있습니다. 그러나이 특정 문제와 관련하여 문제를 해결하는 것보다는 문제를 피하는 것이 더 중요합니다. 여러 줄에 걸쳐있는 여러 문장을 포함하는 스크립트를 평가하는 일관된 방법이 있어야합니까? – Skifozoa

0

뭔가는 다음과 같습니다 :

public REXP executeFromFile(Rengine engine, File file) throws Exception { 
     String fileName = file.getCanonicalPath().replace("\\", "\\\\"); 
     return execute(engine, "source(\""+fileName+"\")"); 
} 
당신은 한 라인에서 여러 명령을 실행 세미콜론을 사용할 수 있습니다
관련 문제