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

How to declare a global variable inside an Rscript and call it from Java

我有一个 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。它抛出不匹配错误。错误的出现是因为,在调用全局变量 e$mydata1 的 R script.The 值的第二个函数时,它没有被初始化,而是 null。但它不应该。我 运行 R 控制台中脚本文件的代码。 运行 很好。但是从 java 调用时,为什么全局变量不起作用。有没有其他解决方案。

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