-->

获得相同输出的R控制台使用的Java JRI(Get same output as R consol

2019-10-21 18:27发布

当我直接输入下列命令到R控制台

library("xts")
mySeries <- xts(c(1.0, 2.0, 3.0, 5.0, 6.0), order.by=c(ISOdatetime(2001, 1, 1, 0, 0, 0), ISOdatetime(2001, 1, 2, 0, 0, 0), ISOdatetime(2001, 1, 3, 0, 0, 0), ISOdatetime(2001, 1, 4, 0, 0, 0), ISOdatetime(2001, 1, 5, 0, 0, 0)))
resultingSeries <- to.monthly(mySeries)
resultingSeries 

我会得到这样的输出

             mySeries.Open mySeries.High mySeries.Low mySeries.Close
Jan 2001             1             6            1              6

当我看着属性,我看到下面的输出

attributes(resultingSeries)

$dim
[1] 1 4

$dimnames
$dimnames[[1]]
NULL

$dimnames[[2]]
[1] "mySeries.Open"  "mySeries.High"  "mySeries.Low"   "mySeries.Close"
$index
[1] 978307200
attr(,"tclass")
[1] "yearmon"
$tclass
[1] "POSIXct" "POSIXt" 
$tzone
[1] ""
$class
[1] "xts" "zoo"
$.indexCLASS
[1] "yearmon"

这是同我在Java中获得。 我想知道,奇迹发生了,让我看到了很好的输出我得到R.我不得不事件循环进不去,因为我使用JRI这样的(因为,这是推荐的方式,并简化了错误处理):

REngine engine = REngine.engineForClass("org.rosuda.REngine.JRI.JRIEngine");
REXP result = engine.parseAndEval(...)

/编辑在Java我从上方执行每个命令如下:

REXP result = engine.parseAndEval("resultingSeries") // or any other command

我得到的是

org.rosuda.REngine.REXPDouble@4ac66122+[12]

有效载荷是双:1,6,1,6个的属性是与上述相同的规定。

现在ř做一些魔术显示上述输出。 有没有一种方法,我可以得到相同的输出,而不必通过自己手动创建它? 哪来的实现存储,是R获得上述输出?

Answer 1:

这里是一段代码,将工作,在这里,我提取从物体resultingSeries领域mySeries.Open(我转换为一个数据帧),它等于1的第一元件,通知,不能传递所有的在resultingSeries对象海峡到Java,你需要打破它。

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("library('xts')");
    rengine.eval("mySeries <- xts(c(1.0, 2.0, 3.0, 5.0, 6.0), order.by=c(ISOdatetime(2001, 1, 1, 0, 0, 0), ISOdatetime(2001, 1, 2, 0, 0, 0), ISOdatetime(2001, 1, 3, 0, 0, 0), ISOdatetime(2001, 1, 4, 0, 0, 0), ISOdatetime(2001, 1, 5, 0, 0, 0)))");
    rengine.eval("resultingSeries <- to.monthly(mySeries)");
    rengine.eval("resultingSeries<-as.data.frame(resultingSeries)");              
    REXP result= rengine.eval("resultingSeries$mySeries.Open");
    System.out.println("Greeting from R: "+result.asDouble());
   }
}

和Java输出:

run:
Greeting from R: 1.0


Answer 2:

我想通了以下解决方法。 该解决方案是远远不够完善。

ř提供了一个命令,以节省其控制台输出作为字符向量。

capture.output( {command} )

我们可以通过访问输出

REXPString s = rengine.parseAndEval("capture.output( to.monthly(mySeries))")
String[] output = result.asStrings()

可变输出将包含所有输出线

[0]             mySeries.Open mySeries.High mySeries.Low mySeries.Close
[1]Jan 2001             1             6            1              6

或者你coud使用JRIEngine并攻击自己的事件循环,它不希望在我的情况(由于更复杂的错误处理)。



文章来源: Get same output as R console in Java using JRI
标签: r jri