【问题标题】:How to execute a R script file from java如何从java执行R脚本文件
【发布时间】:2019-05-26 21:19:39
【问题描述】:

我想从 Java 调用 R 脚本。我已经对该主题进行了谷歌搜索,但我看到的几乎所有结果都需要我向某些第三方库添加依赖项。谁能告诉我一种在不向我的代码添加任何依赖项的情况下完成相同事情的好方法?

我正在设置一个新应用程序,它使用以下行从 java 运行 R 脚本文件

Runtime.getRuntime().exec("C:\\Users\\Thiru\\Desktop helloWorld.R");

但是当我运行应用程序时出现以下异常:

SEVERE: Servlet.service() for servlet [RenjinServlet] in context with 
path 
[/REngineCheck] threw exception
java.io.IOException: Cannot run program "C:\Users\Thiru\Desktop": 
CreateProcess error=5, Access is denied
at java.lang.ProcessBuilder.start(Unknown Source)
at java.lang.Runtime.exec(Unknown Source)
at java.lang.Runtime.exec(Unknown Source)
at java.lang.Runtime.exec(Unknown Source)
at org.r.Check.RenjinServlet.doGet(RenjinServlet.java:102)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at 

org.apache.catalina.core.ApplicationFilterChain.internalDoFilter 
(ApplicationFilterChain.java:291)
at 
org.apache.catalina.core.ApplicationFilterChain.doFilter
(ApplicationFilterChain.java:206)
at org.apache.tomcat.websocket.server.WsFilter.doFilter (WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter 
(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter 
(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke 
(StandardWrapperValve.java:217)
at org.apache.catalina.core.StandardContextValve.invoke 
(StandardContextValve.java:106)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke 
(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke 
(StandardHostValve.java:142)
at org.apache.catalina.valves.ErrorReportValve.invoke 
(ErrorReportValve.java:79)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke 
(AbstractAccessLogValve.java:616)
at org.apache.catalina.core.StandardEngineValve.invoke 
(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service 
(CoyoteAdapter.java:518)
at org.apache.coyote.http11.AbstractHttp11Processor.process 
(AbstractHttp11Processor.java:1091)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process 
(AbstractProtocol.java:673)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun 
(NioEndpoint.java:1500)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run 
 (NioEndpoint.java:1456)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run 
  (TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)
Caused by: java.io.IOException: CreateProcess error=5, Access is denied
at java.lang.ProcessImpl.create(Native Method)
at java.lang.ProcessImpl.<init>(Unknown Source)
at java.lang.ProcessImpl.start(Unknown Source)
... 28 more

【问题讨论】:

  • 如果您的 Windows 未配置为使用Rscript 来运行以.R 结尾的文件,您可能需要使用Runtime.getRuntime().exec("C:\path\to\Rscript.exe C:\Users\Thiru\Desktop\hellowWorld.R")。 (我对java不够熟悉,无法确定这是否应该是一个带有cmd和所有args的字符串,或者你是否需要传递一个以cmd作为第一个元素的列表,你的R脚本作为第二个元素。 )
  • 亲爱的@r2evans,它不起作用我得到文件未找到异常,但是当我在 CMD 中这样运行时,我在 cmd 中得到了输出。 E:\E Drive\Softwares\R docs\R-3.5.1\bin\x64>Rscript C:\Users\Thiru\Desktop\helloWorld.R
  • 如果你尝试Runtime.getRuntime().exec("E:\E Drive\Softwares\R docs\R-3.5.1\bin\x64&gt;Rscript C:\Users\Thiru\Desktop\helloWorld.R")会发生什么?
  • @r2evans,当我这样运行时,我收到了找不到文件的异常。
  • 我的猜测(再次强调,不是 Java 专家)是因为它必须将可执行文件及其参数都包含在一个字符串中。你知道如何使用Runtime.getRuntime().exec吗?我没有。

标签: java r rserve jri


【解决方案1】:

您应该在括号中设置路径,例如

("your_path\Rscript.exe your_path\filename.R")

如果设置环境,可以使用Rscript

例子:

Runtime.getRuntime().exec("C:\\Program Files\\R\\R-3.6.1\\bin\\x64\\Rscript.exe C:\\Users\\Thiru\\Desktop\\helloWorld.R");

【讨论】: