Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从R到java获取长值_Java_R_Jri - Fatal编程技术网

从R到java获取长值

从R到java获取长值,java,r,jri,Java,R,Jri,我正在使用JRI,希望从R中获取一个数值,作为java中的原语。类org.rosuda.REngine.REXP仅提供double()和asInteger()方法。两者都没有按预期工作。这似乎是一个溢出问题 有两个单元测试:第一个使用方法asDouble(),第二个使用asString()(可以扩展为使用biginger.longValue() @测试 public final void testWithDouble()引发异常{ 发动机; engine=REngine.engineForCla

我正在使用JRI,希望从R中获取一个数值,作为java中的原语。类org.rosuda.REngine.REXP仅提供double()和asInteger()方法。两者都没有按预期工作。这似乎是一个溢出问题

有两个单元测试:第一个使用方法asDouble(),第二个使用asString()(可以扩展为使用biginger.longValue()

@测试
public final void testWithDouble()引发异常{
发动机;
engine=REngine.engineForClass(“org.rosuda.REngine.JRI.JRIEngine”);
engine.parseAndEval(“rm(list=ls(all=TRUE))”;
赋值(“a”,新的int[]{100000});

engine.parseAndEval(“b您的测试不测试任何与您描述的内容接近的内容,
long
根本不涉及。您只是将
NA_integer\u
从R传递到Java,因为加法溢出了32位整数,并在R中发出警告。您可以使用
isNA()进行检查。)
方法。如果要避免算术溢出,请使用R中的数字类型。

事实上,没有像long…这样的数据类型,从assign(String,int[])更改为assign(String,double[]),一切正常。
@Test
public final void testWithDouble() throws Exception {
    REngine engine;
    engine = REngine.engineForClass("org.rosuda.REngine.JRI.JRIEngine");
    engine.parseAndEval("rm(list=ls(all=TRUE))");
    engine.assign("a", new int[] { 100000 });
    engine.parseAndEval("b <- a * a");
    REXP exp = engine.parseAndEval("b", null, true);
    double b = exp.asDouble();
    System.out.println(b); // prints -2.147483648E9
    Assert.assertEquals(1e10, b, 1.0);
}

@Test
public final void testWithBigInteger() throws Exception {
    REngine engine;
    engine = REngine.engineForClass("org.rosuda.REngine.JRI.JRIEngine");
    engine.parseAndEval("rm(list=ls(all=TRUE))");
    engine.assign("a", new int[] { 100000 });
    engine.parseAndEval("b <- a * a");
    REXP exp = engine.parseAndEval("options(scipen=99); toString(b)", null, true);
    String b = exp.asString();
    System.out.println(b); // prints "NA"
    Assert.assertEquals("10000000000", b);
    // Now, this can be used to create a BigInteger and then the method longValue() helps.
}
<dependency>
    <groupId>com.github.lucarosellini.rJava</groupId>
    <artifactId>JRIEngine</artifactId>
    <version>0.9-7</version>
</dependency>
<dependency>
    <groupId>org.rosuda.REngine</groupId>
    <artifactId>REngine</artifactId>
    <version>2.1.0</version>
</dependency>