我试图在TomCat 7.0上运行Eclipse中作为IDE运行的一些 R代码来自Java Servlet 。
END目标是创建一个在 TOMCAT 或 JETTY 上运行的网站,以显示图表+数据使用R函数作为Base 64代码返回的现有R代码,以及一些现有Java和Python函数的结果,例如处理和创建高级Excel文件。
(我不会因为很多原因而使用R Shiny Server,所以我想从Java运行R / Python)
为了获得基本设置,我创建了一个动态Web项目,其中包含一个简单的servlet和一个可以运行R代码的test.java文件。
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服务器上运行servlet它工作正常(没有.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下载示例文件/搜索互联网等等但现在没有运气,现在为了获得从Servlet内部运行的R代码。
我忽略了一些简单的事情,还是我需要完全不同?
答案 0 :(得分:1)
查看eclipse-dynamic-web-project中的(新添加的)Renjin Examples。总结自述文件:
另请查看您的&#34; DoR&#34;方法:您正在调用print()
,它将其输出发送到标准输出并返回NULL
。在网络服务器上,这可能会被发送到日志,但肯定不会在对客户端的响应中结束。
如果要将lm()
函数的结果发送给客户端,
例如,您可以使用rjson :: toJSON()序列化它。