我想从R执行Java代码。我使用了rJava包,我能够执行简单的Java代码,例如创建对象或在屏幕上打印。
require("rJava")
.jinit()
test<-new (J ("java.lang.String") , "Hello World!")
但是,我想要做的是从R或CSV文件发送数据帧并用Java执行代码然后将输出文件返回到R.同时,在我的情况下很难调用R代码Java,因为我想首先在R中处理CVS文件,然后在其上应用Java代码并将结果再次返回到R以完成分析。
答案 0 :(得分:1)
我会在这里跟进。
处理R
将此文件保存在某处并确保您知道明确的位置(例如/home/user/some_csv_file.csv
)
String processFile(String file)
processFile
读取文件,将其传递给Java中的代码并执行基于Java的处理processFile
方法的结果并在R 至少,这就是我作为问题解决方案的初稿所做的。
<强>更新强>
我们需要Java文件
// sample/Adapter.java
package sample;
public class Adapter {
public String processFile(String file) {
System.out.println("I am processing file: " + file);
return "new_file_location.csv";
}
public static void main(String [] arg) {
Adapter adp = new Adapter();
System.out.println("Result: " + adp.processFile("initial_file.csv"));
}
}
我们必须编译
> mkdir target
> javac -d target sample/Adapter.java
> java -cp target sample.Adapter
I am processing file: initial_file.csv
Result: new_file_location.csv
> export CLASSPATH=`pwd`/target
> R
我们必须从R
调用它> library(rJava)
> .jinit()
> obj <- .jnew("sample.Adapter")
> s <- .jcall(obj, returnSig="Ljava/lang/String;", method="processFile", 'initial_file')
> s
I am processing file: initial_file
> s
[1] "new_file_location.csv"
您的源目录如下所示
.
├── sample
│ └──Adapter.java
└── target
└── sample
└── Adapter.class
在processFile
中,您可以随意执行任何操作并调用现有的Java代码。