我启动Rserve:
C:\Program Files\R\R-3.5.0\bin\x64> "C:\Users\XXXX\DOCUME~1\R\WIN-LI~1\3.5\Rserve\libs\x64\Rserve.exe" --RS-port 1000
运行以下Java代码:
import org.rosuda.REngine.REXPMismatchException;
import org.rosuda.REngine.Rserve.RConnection;
import org.rosuda.REngine.Rserve.RserveException;
public class TestR {
private RConnection con;
private RConnection con2;
public TestR(){
try {
con = new RConnection();
con2 = new RConnection();
} catch (RserveException e) {
e.printStackTrace();
}
}
public Double test(){
try {
double d = con.eval("1+1").asDouble();
double c = con2.eval("1+1").asDouble();
return d+c;
} catch (RserveException | REXPMismatchException e) {
return (double)(-1);
}
}
}
我在JUnit上创建了以下类对其进行测试:
import org.junit.Test;
import static org.junit.Assert.*;
public class TestRTest {
@Test
public void test(){
TestR t = new TestR();
t.test();
}
}
运行此测试时,它在使连接不稳定的同时停止,它创建了第一个,但在第二个上却挂起。知道为什么会这样吗?
好
好
挂起
答案 0 :(得分:0)
您的问题可能与多线程问题有关。
Unix:没问题,一个Rserve实例可以处理多个调用。
Windows:Rserve无法通过分叉当前进程来创建单独的进程。 ->为每个线程创建一个新的Rserve进程(在另一个端口上侦听),还必须在相应的端口上建立一个新的Rserve连接。
RConnection connection = new RConnection(HOST, PORT);
如果您需要更多意见,请随时询问。如果愿意,我还可以提供完整的类代码,以使用Rserve创建多个R实例。
请参见Java class,我曾经用Rserve运行R的多个实例。