从 R 调用 Java
Call Java from R
我想从 R 执行 Java 代码。我使用了 rJava 包,我能够执行 Java 的简单代码,例如创建对象或在屏幕上打印.
require("rJava")
.jinit()
test<-new (J ("java.lang.String") , "Hello World!")
但是我想要做的是从 R 或 CSV 文件发送数据帧并在 Java 中执行代码,然后 return 将输出文件发送到 R。同时,它是在我的情况下很难从 Java 调用 R 代码,因为我想先在 R 中处理 CVS 文件,然后在其上应用 Java 代码并将结果再次 return 到 R来完成分析。
我会按照这里的方式走。
在R中处理CSV文件
将此文件保存在某处并确保您知道明确的位置(例如 /home/user/some_csv_file.csv
)
- 在 Java 中创建适配器 class 将具有方法
String processFile(String file)
- 内部方法
processFile
读取文件,将其传递给 Java 中的代码并进行基于 Java 的处理
- 将输出文件存储在某处并且return它的位置
- 在R内部,得到
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 代码。
我想从 R 执行 Java 代码。我使用了 rJava 包,我能够执行 Java 的简单代码,例如创建对象或在屏幕上打印.
require("rJava")
.jinit()
test<-new (J ("java.lang.String") , "Hello World!")
但是我想要做的是从 R 或 CSV 文件发送数据帧并在 Java 中执行代码,然后 return 将输出文件发送到 R。同时,它是在我的情况下很难从 Java 调用 R 代码,因为我想先在 R 中处理 CVS 文件,然后在其上应用 Java 代码并将结果再次 return 到 R来完成分析。
我会按照这里的方式走。
在R中处理CSV文件
将此文件保存在某处并确保您知道明确的位置(例如
/home/user/some_csv_file.csv
)- 在 Java 中创建适配器 class 将具有方法
String processFile(String file)
- 内部方法
processFile
读取文件,将其传递给 Java 中的代码并进行基于 Java 的处理 - 将输出文件存储在某处并且return它的位置
- 在R内部,得到
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 代码。