[英]Display Java console output in R using rJava
我創建了以下Java類並將其保存為Test.java
,然后使用javac Test.java
在命令行上編譯為Test.class
:
public class Test {
public Test() {
}
public double power(double number) {
System.out.println("calculating...");
return number * number;
}
}
此外,我創建了以下R腳本並將其保存為test.R
:
library("rJava")
.jinit(classpath = getwd())
test <- .jnew("Test")
.jcall(test, "D", "power", 3)
當我執行它時,例如在命令行上使用R CMD BATCH test.R
,我得到以下輸出,這就是我想要的:
calculating...
[1] 9
但是,當我將此腳本包裝在Markdown文檔中並使用knitr進行編譯時,我將丟失有關正在進行的計算的消息。 例如,我將以下腳本保存在test.Rmd
並使用RStudio進行編譯:
```{r echo=TRUE, warning=TRUE, results='show', message=TRUE}
library("rJava")
.jinit(classpath = getwd())
test <- .jnew("Test")
.jcall(test, "D", "power", 3)
```
這只返回以下輸出,沒有消息:
## [1] 9
我在某處讀到的原因是Java中的System.out.println
寫入stdout
,是否在R控制台中顯示它取決於解釋器。 例如,輸出顯示在Unix系統上,但不顯示在Windows或knitr中。
我的問題:
System.out.println
的輸出? 我會回答我自己的問題......看起來RJava人實際上提供了一個內置的解決方案(感謝Simon Urbanek如果你讀到這個)。 在Java代碼的一側,有LGPL許可JRI.jar
,這與rJava交付(看jri
在子目錄rJava
在您的本地研發庫路徑包目錄),並可以復制/提取進入Java庫路徑。 它只有82kb,所以重量很輕。
JRI提供了Java中默認打印流的替代品。 實質上,您將系統輸出重定向到JRI提供的RConsoleOutputStream
。 上面我的問題中的代碼可以修改如下,以打印到R控制台而不是stdout。
import java.io.PrintStream;
import org.rosuda.JRI.RConsoleOutputStream;
import org.rosuda.JRI.Rengine;
public class Test {
public Test() {
Rengine r = new Rengine();
RConsoleOutputStream rs = new RConsoleOutputStream(r, 0);
System.setOut(new PrintStream(rs));
}
public double power(double number) {
System.out.println("calculating...");
return number * number;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.