java - 从 Java Servlet 运行 R 代码

标签 java r tomcat servlets renjin

我正在尝试从 Java Servlet 中运行一些 R 代码 在 Eclipse 中作为 TomCat 7.0 上的 IDE 运行。

END 目标 是创建一个在 TOMCATJETTY 上运行的网站,以显示制作的图表 + 数据与现有的 R 代码,R 函数返回作为 Base 64 代码,结合一些现有的 Java 和 Python 函数处理和创建高级 Excel 文件的结果。

(出于很多原因我不打算使用 R Shiny Server,所以我想从 Java 运行 R/Python)

为了获得基本设置,我创建了一个动态 Web 项目,其中包含一个简单的 servlet 和一个可以运行 R 代码的 test.java 文件。

测试.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

If i run the test.java as a Java Application it works fine.

If i run the servlet on the TomCat 7.0 server it works fine (without the .append((CharSequence) DoR.collectR()) )

If i run the code with .append((CharSequence) DoR.collectR()) I get the exception:

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());

I have been trying all kinds of things to get this working in Eclipse Version: Mars.1 Release (4.5.1) And downloaded the Example files from Renjin / searching internet and so on but with no luck uptill now to get the R code running from within the Servlet.

Am i overlooking something simple or do i need to do it completely different ?

最佳答案

查看(新增)eclipse-dynamic-web-projectRenjin Examples .总结自述文件:

  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。在网络服务器上,这可能会被发送到日志中,但肯定不会以对客户端的响应结束。

如果要将lm()函数的结果发送给客户端, 例如,您可以使用 rjson::toJSON() 对其进行序列化。

关于java - 从 Java Servlet 运行 R 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36355111/

相关文章:

tomcat - Redis/Jedis - Tomcat 挂起 - - 等待 <5c1a77ba>(一个 org.apache.commons.pool.impl.GenericObjectPool$Latch)

spring - 如何从 Spring 访问配置为 JNDI 资源的 JDBC 驱动程序?

java - 在 RDBMS 中保存 REST API JSON

Java JComponent 在 JFrame 边缘附近被切断

r - 如何使 base64enc::base64decode 的结果可读

r - 写为 CSV 给出奇怪的字符

java - Lucene:处理撇号

java - TableView setRowFactory CSS 选择器

regex - 提取以某个符号结尾但没有此符号的子字符串

java - 如何调试运行在两个不同 Tomcat 服务器上的两个应用程序?