0

TomCat 7.0 の IDE として Eclipse で実行されている Java サーブレットから R コードを実行しようとしています。

ENDの目標は、 TOMCATまたはJETTYで実行される Web サイトを作成して、R 関数が Base 64 コードとして返す既存の R コードで作成されたグラフ + データを、いくつかの既存の Java および Python 関数の処理および高度な Excel ファイルの作成の結果と組み合わせて表示することです。実例。

(私は多くの理由で R Shiny Server を使用しないので、Java から R / Python を実行したい)

基本的なセットアップを行うために、R コードを実行できる単純なサーブレットと test.java ファイルを使用して動的 Web プロジェクトを作成しました。

test.java:

public class test {
      public static void main(String[] args) throws Exception {
          System.out.println(DoR.collectR());
      }
}

DoR.java:

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class DoR {

  public static Object collectR() {
    ScriptEngineManager manager = new ScriptEngineManager();
    ScriptEngine engine = manager.getEngineByName("Renjin");
    if(engine == null) {
        throw new RuntimeException("Renjin Script Engine not found on the classpath.");
    }
    Object catchR = "XX";
    try {
        catchR = engine.eval("df <- data.frame(x=1:10, y=(1:10)+rnorm(n=10));"
                + "print(df);"
                + "print(lm(y ~ x, df))");
    } catch (ScriptException e) {
        e.printStackTrace();
    }
    return catchR;
   }
}

StartTestServlet.java:

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/StartTestServlet")
public class StartTestServlet extends HttpServlet {
  private static final long serialVersionUID = 1L;

  public StartTestServlet() {
    super();
  }

  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //response.getWriter().append("Served at: ").append(request.getContextPath()).append((CharSequence) DoR.collectR());
    response.getWriter().append("Served at: ").append(request.getContextPath());
  }

  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doGet(request, response);
  }
}

ライブラリがインストールされています:

renjin-script-engine-0.7.0-RC2.jar
renjin-studio-0.8.1915-jar-with-dependencies.jar
slf4j-api-1.7.19.jar
slf4j-simple-1.7.19.jar

test.java を Java アプリケーションとして実行すると、正常に動作します。

TomCat 7.0サーバーでサーブレットを実行すると、正常に動作します( .append((CharSequence) DoR.collectR()) なし)

.append((CharSequence) DoR.collectR()) でコードを実行すると、例外が発生します。

java.lang.RuntimeException: Renjin Script Engine not found on the classpath.
    ......DoR.collectR(DoR.java:16)
    ......StartTestServlet.doGet(StartTestServlet.java:19)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)

DoR.java:16 は次の行です。

try {

StartTestServlet.doGet(StartTestServlet.java:19) は次の行です。

response.getWriter().append("Served at: ").append(request.getContextPath()).append((CharSequence) DoR.collectR());

私はEclipseバージョンでこれを機能させるためにあらゆる種類のことを試みてきました:Mars.1リリース(4.5.1) そしてRenjinからサンプルファイルをダウンロードしたり、インターネットを検索したりしましたが、Rコードを実行するまで今まで運がありませんでしたサーブレット内から。

私は単純なことを見落としていますか、それともまったく違うことをする必要がありますか?

4

1 に答える 1

1

Renjin Examplesの (新しく追加された) eclipse-dynamic-web-projectを参照してください。README を要約すると、次のようになります。

  1. Renjin Downloads Pageからスタンドアロンの renjin-script-engine-0.8.1931-jar-with-dependencies.jar をダウンロードします。古いバージョンの renjin-script-engine と GUI jar を組み合わせているようです。
  2. この JAR を WebContent/WEB-INF/lib にコピーして、アプリケーションと共にデプロイできるようにします。

「DoR」メソッドも見てください。print()出力を標準出力に送信して を返しますNULL。Web サーバーでは、これがログに送信される場合がありますが、クライアントへの応答にはなりません。

関数の結果をlm()クライアントに送信する場合は、たとえば rjson::toJSON() を使用してシリアル化できます。

于 2016-04-02T20:29:57.057 に答える