【问题标题】:How to declare a global variable inside an Rscript and call it from Java如何在 Rscript 中声明一个全局变量并从 Java 中调用它
【发布时间】:2016-01-05 07:08:43
【问题描述】:

我有一个 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 的值没有被初始化,并且为空。但它不应该。我在 R 控制台中运行了脚本文件的代码。它运行良好。但是从java调用时,为什么全局变量不起作用。有没有其他解决方案。

【问题讨论】:

  • myfun2 接受参数file-path,这不是一个有效的 R 变量名。
  • 抱歉输入错误

标签: java r rserve


【解决方案1】:

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

【讨论】:

  • 其实上面的代码只是尝试在Rserve env中设置一个全局变量。我正在构建一个应用程序,我在其中读取了 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_data2.R\")"); RList a = c.eval("x
  • @Simon,你的想法现在奏效了我没有使用几个 Rconnection。我只使用一个 Rconnection。我是个傻瓜。我被这个愚蠢的错误困住了。谢谢西蒙
猜你喜欢
  • 2019-02-04
  • 1970-01-01
  • 2012-03-30
  • 1970-01-01
  • 2011-03-22
  • 2011-02-12
  • 2012-11-11
  • 2019-09-11
  • 1970-01-01
相关资源
最近更新 更多