运行 R 脚本使用 JAVA 程序
Run R script using JAVA program
我是 R 编程新手。我创建了一个简单的 R 脚本并尝试使用 JAVA class 运行 它,但我做不到。
我尝试过使用 Rserve 和 rJava。使用 Rserve,代码执行在创建 "RConnection" 实例后停止,而使用 rJava 给出异常 "java.lang.UnsatisfiedLinkError: jri.dll: Can't find dependent libraries".
JAVAclass代码如下:
对于 rJava:
import org.rosuda.JRI.Rengine;
public class Temp {
public static void main(String a[]) {
// Create an R vector in the form of a string.
String javaVector = "c(1,2,3,4,5)";
// Start Rengine.
Rengine engine = new Rengine(new String[] { "--no-save" }, false, null);
// The vector that was created in JAVA context is stored in 'rVector' which is a variable in R context.
engine.eval("rVector=" + javaVector);
//Calculate MEAN of vector using R syntax.
engine.eval("meanVal=mean(rVector)");
//Retrieve MEAN value
double mean = engine.eval("meanVal").asDouble();
//Print output values
System.out.println("Mean of given vector is=" + mean);
}
}
对于保留:
import org.rosuda.REngine.REXPMismatchException;
import org.rosuda.REngine.Rserve.RConnection;
import org.rosuda.REngine.Rserve.RserveException;
public class Temp {
public static void main(String a[]) {
RConnection connection = null;
System.out.println("line 10");
try {
// Create a connection to Rserve instance running on default port 6311
System.out.println("line 15");
connection = new RConnection();
System.out.println("line 17");
//Note four slashes (\\) in the path
connection.eval("source('D:\\RExamples\\helloworld.R')");
System.out.println("line 19");
int num1=10;
int num2=20;
int sum=connection.eval("myAdd("+num1+","+num2+")").asInteger();
System.out.println("The sum is=" + sum);
} catch (RserveException e) {
e.printStackTrace();
} catch (REXPMismatchException e) {
e.printStackTrace();
}
}
}
如果您不明白我的问题或者您想了解其他信息,请告诉我。提前致谢。
您只想调用一个外部应用程序:下面的方法不行吗?
Runtime.getRuntime().exec("Rscript myScript.R");
归功于 Whosebug itself
有两种不同的方法来连接 Java 和 R。
如果您想使用 JRI,您必须使用指向包含 JRI 库的文件夹的 JVM 参数 -Djava.library.path
来启动您的 java 程序.
例如:
$JAVA_HOME/bin/java -Djava.library.path=/app/vendor/R/lib/R/library/rJava/jri/ -jar target/myapp.jar
如果您找不到 JRI 安装目录,请尝试查找 JRI SO 库:
find / -name "libjri.*"
此外,请确保您已在您的环境中创建 R_HOME 和 LD_LIBRARY_PATH:
- R_HOME: 指向本地 R 安装 (Ej: /Library/Frameworks/R.framework/Resources)
- LD_LIBRARY_PATH: 指向R lib目录和JRI目录(EJ: $LD_LIBRARY_PATH:/app/vendor/R/lib/R/lib:/app/vendor/R/lib/R/bin)
另一方面,如果你想使用Rserve,你需要在单独的进程中启动Rserve,然后创建来自您的 java 进程的 RConnection。
例如:
if(LOGGER.isInfoEnabled()) {
LOGGER.info("Starting RServe process...");
}
ProcessBuilder builder = new ProcessBuilder("/bin/sh", "-c", String.format("echo 'library(Rserve);Rserve(FALSE,args=\"--no-save --slave --RS-conf %s\")'|%s --no-save --slave", rserveConf, rexe));
builder.inheritIO();
Process rProcess = builder.start();
if(LOGGER.isInfoEnabled()) {
LOGGER.info("Waiting for Rserve to start...");
}
int execCodeResult = rProcess.waitFor();
if(execCodeResult != SUCCESS_CODE) {
LOGGER.error(String.format("Unexpected error code starting RServe: %d", execCodeResult));
} else {
LOGGER.error("RServe started successfully");
}
if(LOGGER.isInfoEnabled()) {
LOGGER.info("Opening connection to RServe daemon....");
}
REngine engine = new RConnection();
if(LOGGER.isInfoEnabled()) {
LOGGER.info(String.format("Obtaining R server version: %d", ((RConnection)engine).getServerVersion()));
}
//Perform some engine.parseAndEval("....");
rserveConf 是 Rserv conf 文件的路径,rexe 是 R 可执行文件的完整路径。
例如,在我的 MacOS 计算机中,我可以启动 Rserve 执行以下行:
/bin/sh -c "echo 'library(Rserve);Rserve(FALSE,args=\"--slave --RS-conf /Users/me/Documents/test/rserve.conf\")'|/Library/Frameworks/R.framework/Versions/3.2/Resources/bin/exec/R --no-save --slave"
此命令输出如下内容:
Starting Rserve:
/Library/Frameworks/R.framework/Resources/bin/R CMD /Library/Frameworks/R.framework/Versions/3.2/Resources/library/Rserve/libs//Rserve --slave
Rserv started in daemon mode.
确保在启动 Rserve 时指定“--slave”参数。
如果您想查看更多示例,我在 github:
中有一个同时使用 JRI 和 RServe 两种方法的演示项目
另一种方法是使用 r 的 OpenCpu 包。
这是一个非常简单的服务器(不幸的是单线程),它通过 http 接收 r 个函数调用,returns 输出作为响应。
我用它来与 java 交互。
我是 R 编程新手。我创建了一个简单的 R 脚本并尝试使用 JAVA class 运行 它,但我做不到。
我尝试过使用 Rserve 和 rJava。使用 Rserve,代码执行在创建 "RConnection" 实例后停止,而使用 rJava 给出异常 "java.lang.UnsatisfiedLinkError: jri.dll: Can't find dependent libraries".
JAVAclass代码如下:
对于 rJava:
import org.rosuda.JRI.Rengine;
public class Temp {
public static void main(String a[]) {
// Create an R vector in the form of a string.
String javaVector = "c(1,2,3,4,5)";
// Start Rengine.
Rengine engine = new Rengine(new String[] { "--no-save" }, false, null);
// The vector that was created in JAVA context is stored in 'rVector' which is a variable in R context.
engine.eval("rVector=" + javaVector);
//Calculate MEAN of vector using R syntax.
engine.eval("meanVal=mean(rVector)");
//Retrieve MEAN value
double mean = engine.eval("meanVal").asDouble();
//Print output values
System.out.println("Mean of given vector is=" + mean);
}
}
对于保留:
import org.rosuda.REngine.REXPMismatchException;
import org.rosuda.REngine.Rserve.RConnection;
import org.rosuda.REngine.Rserve.RserveException;
public class Temp {
public static void main(String a[]) {
RConnection connection = null;
System.out.println("line 10");
try {
// Create a connection to Rserve instance running on default port 6311
System.out.println("line 15");
connection = new RConnection();
System.out.println("line 17");
//Note four slashes (\\) in the path
connection.eval("source('D:\\RExamples\\helloworld.R')");
System.out.println("line 19");
int num1=10;
int num2=20;
int sum=connection.eval("myAdd("+num1+","+num2+")").asInteger();
System.out.println("The sum is=" + sum);
} catch (RserveException e) {
e.printStackTrace();
} catch (REXPMismatchException e) {
e.printStackTrace();
}
}
}
如果您不明白我的问题或者您想了解其他信息,请告诉我。提前致谢。
您只想调用一个外部应用程序:下面的方法不行吗?
Runtime.getRuntime().exec("Rscript myScript.R");
归功于 Whosebug itself
有两种不同的方法来连接 Java 和 R。
如果您想使用 JRI,您必须使用指向包含 JRI 库的文件夹的 JVM 参数 -Djava.library.path
来启动您的 java 程序.
例如:
$JAVA_HOME/bin/java -Djava.library.path=/app/vendor/R/lib/R/library/rJava/jri/ -jar target/myapp.jar
如果您找不到 JRI 安装目录,请尝试查找 JRI SO 库:
find / -name "libjri.*"
此外,请确保您已在您的环境中创建 R_HOME 和 LD_LIBRARY_PATH:
- R_HOME: 指向本地 R 安装 (Ej: /Library/Frameworks/R.framework/Resources)
- LD_LIBRARY_PATH: 指向R lib目录和JRI目录(EJ: $LD_LIBRARY_PATH:/app/vendor/R/lib/R/lib:/app/vendor/R/lib/R/bin)
另一方面,如果你想使用Rserve,你需要在单独的进程中启动Rserve,然后创建来自您的 java 进程的 RConnection。
例如:
if(LOGGER.isInfoEnabled()) {
LOGGER.info("Starting RServe process...");
}
ProcessBuilder builder = new ProcessBuilder("/bin/sh", "-c", String.format("echo 'library(Rserve);Rserve(FALSE,args=\"--no-save --slave --RS-conf %s\")'|%s --no-save --slave", rserveConf, rexe));
builder.inheritIO();
Process rProcess = builder.start();
if(LOGGER.isInfoEnabled()) {
LOGGER.info("Waiting for Rserve to start...");
}
int execCodeResult = rProcess.waitFor();
if(execCodeResult != SUCCESS_CODE) {
LOGGER.error(String.format("Unexpected error code starting RServe: %d", execCodeResult));
} else {
LOGGER.error("RServe started successfully");
}
if(LOGGER.isInfoEnabled()) {
LOGGER.info("Opening connection to RServe daemon....");
}
REngine engine = new RConnection();
if(LOGGER.isInfoEnabled()) {
LOGGER.info(String.format("Obtaining R server version: %d", ((RConnection)engine).getServerVersion()));
}
//Perform some engine.parseAndEval("....");
rserveConf 是 Rserv conf 文件的路径,rexe 是 R 可执行文件的完整路径。
例如,在我的 MacOS 计算机中,我可以启动 Rserve 执行以下行:
/bin/sh -c "echo 'library(Rserve);Rserve(FALSE,args=\"--slave --RS-conf /Users/me/Documents/test/rserve.conf\")'|/Library/Frameworks/R.framework/Versions/3.2/Resources/bin/exec/R --no-save --slave"
此命令输出如下内容:
Starting Rserve:
/Library/Frameworks/R.framework/Resources/bin/R CMD /Library/Frameworks/R.framework/Versions/3.2/Resources/library/Rserve/libs//Rserve --slave
Rserv started in daemon mode.
确保在启动 Rserve 时指定“--slave”参数。
如果您想查看更多示例,我在 github:
中有一个同时使用 JRI 和 RServe 两种方法的演示项目另一种方法是使用 r 的 OpenCpu 包。 这是一个非常简单的服务器(不幸的是单线程),它通过 http 接收 r 个函数调用,returns 输出作为响应。
我用它来与 java 交互。