我有一个Rscript myrscript.R,它有以下代码。
if(exists("e")==FALSE)
{
e = new.env()
}
myfun1<-function(file_path)
{
mydata<-read.csv(file_path)
e$mydata1 =mydata
return("firstfunction")
}
myfun2<-function()
{
e$mydata1
names_mydata<-colnames(e$mydata1)
nm<-names_mydata[1]
return(nm)
}
我使用以下代码从java调用此脚本。
public class mymainclass {
public static void main(String[] args) throws RserveException, REXPMismatchException {
String file_path1="/home/jayshree/test_data.csv";
mymainclass mm=new mymainclass();
String s = mm.myfun_2(file_path1);
String l3 = mm.myfun_3();
System.out.println(s);
System.out.println(l3);
}
public static String myfun_2(String file_path) throws RserveException, REXPMismatchException
{
RConnection c = new RConnection();
c.eval("source(\"/home/jayshree/myrscript.R\")");
c.assign("file_path",file_path);
String a = c.eval("myfun1(file_path)").asString();
return(a);
}
public static String myfun_3() throws RserveException, REXPMismatchException
{
RConnection c = new RConnection();
c.eval("source(\"/home/jayshree/myrscript.R\")");
String b = c.eval("myfun2()").asString;
return(b);
}
}
从java运行时。它抛出不匹配错误。出现错误的原因是,在调用R脚本的第二个函数时。全局变量e $ mydata1的值未初始化,并且为null。但它不应该。我在R控制台中运行了脚本文件的代码。它运行正常。但是在从java调用时,为什么全局变量不起作用。有没有替代解决方案。
答案 0 :(得分:2)
您每次都在创建新连接,因此呼叫完全独立。即,在myfun_3
中,您启动一个空的新R会话,因此预计它不会加载任何数据。如果希望函数在同一会话中工作,则必须使用相同的RConnection
对象。