如何在Rscript中声明全局变量并从Java调用它
我有一个Rscript myrscript.R,它有下面的代码如何在Rscript中声明全局变量并从Java调用它,java,r,rserve,Java,R,Rserve,我有一个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<-
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运行这个时。这是一个错误。出现错误的原因是,在调用R脚本的第二个函数时,全局变量e$mydata1的值未初始化,为null。但它不应该这样做。我在R控制台中运行了脚本文件的代码。它运转良好。但是,当从java调用时,为什么全局变量不起作用呢。是否有其他解决方案。您每次都在创建一个新连接,因此呼叫是完全独立的。也就是说,在
myfun_3
中,您启动一个空的、新的R会话,因此预计它不会加载任何数据。如果希望函数在同一个会话上工作,则必须使用相同的R连接
对象。myfun2
接受参数文件路径
,该参数不是有效的R变量名。很抱歉,键入的是错误。实际上,上面的代码只是尝试在Rserve环境中设置全局变量。我正在构建一个应用程序,其中我已经读取了csv文件并执行了一些分析并返回了结果。因为我无法在每次需要从csv获取数据时设置全局变量。数据文件大小约为1 gb。现在我可以在Rserve环境中设置一个全局变量,但我遇到错误“OutOfMemoryError:Java heap space”。我的代码适用于小csv文件,但不适用于大文件。我使用的是os-centos6.5、netbeans8.1、java1.7、R3.2和glassfish-4.1.1。我在谷歌上搜索来解决这个问题,我尝试了各种解决方案,但仍然得到相同的错误。我喜欢这样做,它适用于小数据集,但不适用于大数据。这是一个示例。RConnection c=新的RConnection();c、 eval(“source(\”/home/jayshree/Desktop/return\u data2.R\”);RList a=c.eval(“x@Simon,你的想法奏效了,我现在没有使用几个连接。我只使用一个连接。我很傻。我被这个愚蠢的错误卡住了。谢谢你,Simon
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);
}
}