를 사용하여 여러 줄의 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;
}
}
R, 그래서 만약 당신이 모든'\ n'을';'로 바꾸고 그것을 하나의 긴 문자열에 넣으면 작동 할 것이라고 생각합니다. – alistaire
의견을 보내 주셔서 감사합니다. 불행하게도'engine.eval ("print (\"Hello \ "); print (\"World! \ ")");만이 "Hello"를 출력합니다. – Skifozoa