使用rJava在R中显示Java控制台输出

使用rJava在R中显示Java控制台输出,java,r,knitr,stdout,rjava,Java,R,Knitr,Stdout,Rjava,我创建了以下Java类并将其保存为Test.Java,然后使用javac Test.Java在命令行上编译成Test.class: 公共类测试{ 公开考试(){ } 公共双重权力(双重数字){ System.out.println(“计算…”); 返回编号*编号; } } 此外,我还创建了以下R脚本并将其保存为test.R: 库(“rJava”) .jinit(classpath=getwd()) 测试我将尝试回答我自己的问题。。。看起来RJava的人实际上提供了一个内置的解决方案(如果您阅读

我创建了以下Java类并将其保存为
Test.Java
,然后使用
javac Test.Java
在命令行上编译成
Test.class

公共类测试{
公开考试(){
}
公共双重权力(双重数字){
System.out.println(“计算…”);
返回编号*编号;
}
}
此外,我还创建了以下R脚本并将其保存为
test.R

库(“rJava”)
.jinit(classpath=getwd())

测试我将尝试回答我自己的问题。。。看起来RJava的人实际上提供了一个内置的解决方案(如果您阅读本文,请感谢Simon Urbanek)。在Java代码方面,有LGPL许可的
JRI.jar
,它随rJava一起提供(查看本地R库路径中
rJava
包目录中的
JRI
子目录),可以复制/提取到Java库路径中。它只有82kb,所以相当轻

JRI提供了Java中默认打印流的替换。本质上,您可以将系统输出重定向到JRI提供的
RConsoleOutputStream
。我上面问题中的代码可以修改如下,以打印到R控制台,而不是标准输出

导入java.io.PrintStream;
导入org.rosuda.JRI.RConsoleOutputStream;
导入org.rosuda.JRI.Rengine;
公开课考试{
公开考试(){
重新引擎r=新的重新引擎();
RConsoleOutputStream rs=新的RConsoleOutputStream(r,0);
系统放样(新打印流(rs));
}
公共双重权力(双重数字){
System.out.println(“计算…”);
返回编号*编号;
}
}
令人沮丧的是,我(在某个时候)发现java输出绕过了R的许多工作方式。答案不多,更多的是一种预兆,“这应该很容易,但我发现不是”。
calculating...
[1] 9
## [1] 9