如何在Rscript中声明一个全局变量并从Java调用它

时间:2016-01-05 07:08:44

标签: 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<-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调用时,为什么全局变量不起作用。有没有替代解决方案。

1 个答案:

答案 0 :(得分:2)

您每次都在创建新连接,因此呼叫完全独立。即,在myfun_3中,您启动一​​个空的新R会话,因此预计它不会加载任何数据。如果希望函数在同一会话中工作,则必须使用相同的RConnection对象。