如何在 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
对象。
我有一个 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
对象。