首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JRI的问题

JRI的问题
EN

Stack Overflow用户
提问于 2014-11-07 06:21:34
回答 3查看 1.7K关注 0票数 2

我正在尝试运行JRI的一个示例,但没有成功,这里有一个指向该示例的链接。http://blog.comsysto.com/2013/07/10/java-r-integration-with-jri-for-on-demand-predictions/

代码语言:javascript
复制
import org.rosuda.JRI.Rengine;
import org.rosuda.JRI.REXP;

public class HelloRWorld {
   Rengine rengine; // initialized in constructor or autowired

   public void helloRWorld() {
      rengine.eval(String.format("greeting <- '%s'", "Hello R World"));
      REXP result = rengine.eval("greeting");
      System.out.println("Greeting from R: "+result.asString());
   }
}

这是控制台给我的错误。

代码语言:javascript
复制
Exception in thread "main" java.lang.NullPointerException
    at org.roulette.games.HelloRWorld.helloRWorld(HelloRWorld.java:10)
    at org.roulette.games.HelloRWorld.main(HelloRWorld.java:17)

据我所知,我已经将外部JRI 2014-10-19 jar正确地附加到了项目中。我已经安装了R 3.1.2和rJava 0.9-6包。

第10行是"rengine.eval(String.format("greeting <- '%s'","Hello R World"));“。

第17行是"hello.helloRWorld();“。

如果你知道为什么会抛出这些异常,请让我知道……:)

EN

回答 3

Stack Overflow用户

发布于 2015-02-04 20:16:23

试试这个: is works:

代码语言:javascript
复制
package stackoverflow;

import org.rosuda.JRI.REXP;
import org.rosuda.JRI.Rengine;
/**
 *
 * @author yschellekens
 */
public class StackOverflow {  

   public static void main(String[] args) throws Exception {
    String[] Rargs = {"--vanilla"};
     Rengine rengine = new Rengine(  Rargs, false, null);
     rengine.eval("greeting <- '%Hello R World'");
      REXP result = rengine.eval("greeting");
      System.out.println("Greeting from R: "+result.asString());
   }
}

请注意,您有几个错误,包括没有包括主类,以及没有创建正确的构造函数。

票数 1
EN

Stack Overflow用户

发布于 2015-10-02 19:55:22

连接Java和R有两种不同方法。

如果你想使用JRI ,你必须使用JVM参数-Djava.library.path来启动你的程序,指向包含JRI库的文件夹。

例如:

代码语言:javascript
复制
$JAVA_HOME/bin/java  -Djava.library.path=/app/vendor/R/lib/R/library/rJava/jri/ -jar target/myapp.jar

如果您在查找JRI安装目录时遇到问题,请尝试查找JRI SO库:

代码语言:javascript
复制
find / -name "libjri.*"

此外,确保已在您的环境中创建了R_HOME和LD_LIBRARY_PATH:

指向本地R安装的

  • R_HOME:(Ej: /Library/Frameworks/R.framework/Resources)
  • LD_LIBRARY_PATH:指向R目录和JRI目录(EJ:$LD_LIBRARY_PATH:/app/vendor/R/lib/R/lib:/app/vendor/R/lib/R/bin)

下面是一个示例:

代码语言:javascript
复制
@Test
public void testMeanFunction() {

    // just making sure we have the right version of everything
    if (!Rengine.versionCheck()) {
        System.err.println("** Version mismatch - Java files don't match library version.");
        fail(String.format("Invalid versions. Rengine must have the same version of native library. Rengine version: %d. RNI library version: %d", Rengine.getVersion(), Rengine.rniGetVersion()));
    }

    // Enables debug traces
    Rengine.DEBUG = 1;

    System.out.println("Creating Rengine (with arguments)");
    // 1) we pass the arguments from the command line
    // 2) we won't use the main loop at first, we'll start it later
    // (that's the "false" as second argument)
    // 3) no callback class will be used
    engine = REngine.engineForClass("org.rosuda.REngine.JRI.JRIEngine", new String[] { "--no-save" }, null, false);
    System.out.println("Rengine created...");

    engine.parseAndEval("rVector=c(1,2,3,4,5)");
    REXP result = engine.parseAndEval("meanVal=mean(rVector)");
    // generic vectors are RVector to accomodate names
    assertThat(result.asDouble()).isEqualTo(3.0);
}

另一方面,如果您想要使用 Rserve ,则需要在单独的进程中启动Rserve,然后从您的java进程创建一个RConnection。

例如:

代码语言:javascript
复制
        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是服务器配置文件的路径,rexe是R可执行文件的完整路径。

例如,在我的MacOS计算机中,我可以启动Rserve执行以下代码行:

代码语言:javascript
复制
/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"

此命令输出类似以下内容:

代码语言:javascript
复制
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:

https://github.com/jfcorugedo/RJavaServer

票数 1
EN

Stack Overflow用户

发布于 2016-10-06 16:52:03

您应该使用下面的命令导出LD_LIBRARY_PATH

代码语言:javascript
复制
export LD_LIBRARY_PATH=/usr/lib/jvm/jre/lib/amd64:/usr/lib/jvm/jre/lib/amd64/default

并从R中执行

代码语言:javascript
复制
install.packages("rJava")

这肯定会使您的REngine在您的java应用程序中成功工作

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26790505

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档