【问题标题】:Run R script from java从java运行R脚本
【发布时间】:2018-09-22 02:05:12
【问题描述】:

当我尝试从 Java 运行 R 脚本时遇到问题。我真的在互联网上寻找这个问题的答案,但没有任何效果。

我使用过 Rserve 和 Runtime.getRuntime().exec("Rscript myScript.R") 但它们都不能与我的程序一起使用。

请帮帮我

这是java代码

RConnection c = new RConnection();
                double d[] = c.eval("rnorm(10)").asDoubles();
                org.rosuda.REngine.REXP x0 = c.eval("R.version.string");
                System.out.println(x0.asString());
                Runtime.getRuntime().exec("Rscript TestR.R");

这是我添加 Runtime.getRuntime().exec("Rscript "+rScriptFileName); 时抛出的错误消息到上面的代码:

线程“main”java.io.IOException 中的异常:无法运行程序“Rscript”:CreateProcess 错误 = 2,Le fichier spécifié est introuvable 在 java.lang.ProcessBuilder.start(未知来源) 在 java.lang.Runtime.exec(未知来源) 在 java.lang.Runtime.exec(未知来源) 在 java.lang.Runtime.exec(未知来源) 在 algo.Testtest.main(Testtest.java:23) 原因:java.io.IOException: CreateProcess error=2, Le fichier spécifié est introuvable 在 java.lang.ProcessImpl.create(本机方法) 在 java.lang.ProcessImpl.(未知来源) 在 java.lang.ProcessImpl.start(未知来源) ... 5 更多

【问题讨论】:

  • 您可能需要可执行文件的绝对路径。找不到文件异常意味着找不到可执行文件。 IIRC,exec(...) 不会搜索您的路径。

标签: java r rjava rscript rserve


【解决方案1】:

对我有用的是使用 Renjin 解释器Download Renjin

private static final ThreadLocal<ScriptEngine> ENGINE = new ThreadLocal<>();

public static void main(String[] args) {
    ScriptEngine engine = getScriptEngine();
    try {
        System.out.println("myScript");
        engine.eval(new java.io.FileReader("src/myScript.R"));
        engine.eval("Square(19)");
    } catch (FileNotFoundException | NullPointerException | ScriptException e) {
        System.out.println("An exception occured: " + e.getMessage());
        e.printStackTrace();
    }
}

private static ScriptEngine getScriptEngine() {
    ScriptEngine engine = ENGINE.get();
    if (engine == null) {
        // Create a new ScriptEngine for this thread if one does not exist.
        RenjinScriptEngineFactory factory = new RenjinScriptEngineFactory();
        engine = factory.getScriptEngine();
        ENGINE.set(engine);
    }
    return engine;
}

【讨论】: