2

R を使用して計算を実行する必要がある Java ベースの Web アプリケーションを開発しています。rJava/JRI を適切にインストールして構成することができましたが、この時点で立ち往生しています。コンソール アプリから R を呼び出すと、常にうまく機能しますが、サーブレット (または Spring Bean) から R を呼び出すと、 、私は両方を試しました)、このRコードには「source( 'r_script.R')」命令があり、最初の呼び出しだけでうまく機能します。2 番目の呼び出しは REXP 内で NULL を返し、3 番目の呼び出しは REngine をハングさせます。これは私のコードです:

Java サーブレットの場合:

String rScriptUrl = this.getClass().getClassLoader().getResource("example1.R").getFile();
File rScriptFile = new File(rScriptUrl);
if (!rScriptFile.exists()) {
    System.err.println("R script does not exist!");
    return;
}

System.out.println("Loading REngine...");
Rengine re = new Rengine(new String[]{"--vanilla"}, false, null);
System.out.println("Rengine created, waiting for R");

if (!re.waitForR()) {
    System.out.println("Cannot load R");
    return;
}
System.out.println("R loaded!");

String rScriptPath = rScriptFile.getAbsolutePath();
rScriptPath = rScriptPath.replace("\\", "/");

String expr = String.format("source('%s')", rScriptPath);
re.eval(expr);

REXP result = re.eval("f1(10, 2)");
if (result != null) {
    System.out.println(">>>>>> result from R: " + result.asDouble());
} else {
    System.err.println(">>>>>> result is NULL");
}

re.end();

example1.R には以下が含まれます。

f1 <- function(a, b) {  return(a / b)  }

したがって、この正確な例を Java コンソール アプリで試すと、常にうまく機能します。R 関数 "f1" が実行され、期待どおり "5" が返されます。サーブレットから R を呼び出すが、"source('example1.R')" を使用しない場合、たとえば re.eval("2 * 3") を実行すると、同様に正常に実行され、6 が返されます。 source('example1.R')" と実行

REXP result = re.eval("f1(10, 2)");

最初の実行では適切に 5 が返され、2 回目の実行 (F5 を押すだけ) では NULL が返され、3r の実行コードは次の場所でハングします。

Rengine re = new Rengine(new String[]{"--vanilla"}, false, null);

誰でもこれに光を当てることができますか?何か案は?

どうもありがとう、マルコス

4

0 に答える 0