我能够通过 Java 应用程序中的 Rserve 在 R 脚本中执行远程命令执行和函数调用。但是当我的函数尝试将数据帧保存在 csv 文件中时,使用
write.csv(MyData, file = "MyData.csv")
它们 MyData.csv 文件未生成,并且未显示任何错误。 当我在 R 控制台中执行相同的步骤时,它工作正常。
Rserve在我的本地机器本身中运行,我正在使用以下内容进行连接和执行:
RConnection connection = new RConnection();
connection.eval("makecsv()")
附言我省略了上面的"源 R 脚本"步骤
仅供参考,这是我尝试运行的虚拟 R 脚本:
makecsv <- function(){
x<-rnorm(10)
y<-rnorm(10)
df1<-data.frame(x,y)
write.csv(df1, file = "MyData.csv")
return(df1)
}
可能你必须使用绝对路径,如下所示:
write.csv(MyData, file = "/var/MyData.csv")
如果您的Rserve
已死,则可能会发生这种情况。使用适当的错误处理包装 try-catch 有助于调试。
这个版本对我有用:
import org.rosuda.REngine.*;
import org.rosuda.REngine.Rserve.*;
public class Main {
public static void main(String[] args) {
try {
RConnection c = new RConnection();
org.rosuda.REngine.REXP getwd = c.eval("getwd()");
System.out.println(getwd.asString());
c.eval("source("main.R")");
c.eval("makecsv()");
c.close();
} catch (REngineException | REXPMismatchException e) {
e.printStackTrace();
}
}
}
输出为:
C:/Users/moon/Documents
Process finished with exit code 0
在Documents
文件夹中,我有MyData.csv
.
这里有 2 个建议:
- 尝试先将字符串解析为表达式,方法是
connection.eval(parse("makecsv()"))
- 通过
connection.eval("getwd()")
检查工作目录