如何在 Processing 中使用 R 而无需在每次迭代中创建新连接
How to work with R from within Processing without creating in every iteration a new connection
我正在尝试在 Processing 上创建一个程序,它可以在 Processing 的绘制部分的每次迭代中在 R 中进行一些计算。这些计算需要使用我需要在 Rsession 中加载的包内的函数来完成。
我正在使用 Rserve 将 R 与处理连接起来。
我曾经执行以下操作,但它会导致在每次迭代中加载所述库。
void draw{
try {
c.eval("library('png');library('glmnet')");
}catch ( REXPMismatchException rme ) {
rme.printStackTrace();
} catch ( REngineException e ) {
e.printStackTrace();
}
所以我尝试了以下方法
void setup() {
try {
RConnection c = new RConnection();
c.eval("library('png');library('glmnet')");
} catch ( REngineException e ) {
e.printStackTrace();
}
void draw() {
try {
//calculations using functions from libraries above
}catch ( REXPMismatchException rme ) {
rme.printStackTrace();
} catch ( REngineException e ) {
e.printStackTrace();
}
}
但是第二种方法会导致以下错误
Cannot find anything called "c"
所以我猜连接在设置阶段后无法继续存在。
如何使用第二个结构保留 rconnection?
我对 R 一无所知,但这里的问题似乎是您的变量超出了范围。您只需要在 setup() 和 draw() 函数中为其提供范围的地方声明它,即在草图的顶部:
RConnection c;
void setup() {
try {
c = new RConnection();
c.eval("library('png');library('glmnet')");
}
catch ( REngineException e ) {
e.printStackTrace();
}
}
void draw() {
try {
//you can now use your c variable here
}
catch ( REXPMismatchException rme ) {
rme.printStackTrace();
}
catch ( REngineException e ) {
e.printStackTrace();
}
}
有关 Processing 范围的更多信息,请参见 here。
我正在尝试在 Processing 上创建一个程序,它可以在 Processing 的绘制部分的每次迭代中在 R 中进行一些计算。这些计算需要使用我需要在 Rsession 中加载的包内的函数来完成。
我正在使用 Rserve 将 R 与处理连接起来。
我曾经执行以下操作,但它会导致在每次迭代中加载所述库。
void draw{
try {
c.eval("library('png');library('glmnet')");
}catch ( REXPMismatchException rme ) {
rme.printStackTrace();
} catch ( REngineException e ) {
e.printStackTrace();
}
所以我尝试了以下方法
void setup() {
try {
RConnection c = new RConnection();
c.eval("library('png');library('glmnet')");
} catch ( REngineException e ) {
e.printStackTrace();
}
void draw() {
try {
//calculations using functions from libraries above
}catch ( REXPMismatchException rme ) {
rme.printStackTrace();
} catch ( REngineException e ) {
e.printStackTrace();
}
}
但是第二种方法会导致以下错误
Cannot find anything called "c"
所以我猜连接在设置阶段后无法继续存在。 如何使用第二个结构保留 rconnection?
我对 R 一无所知,但这里的问题似乎是您的变量超出了范围。您只需要在 setup() 和 draw() 函数中为其提供范围的地方声明它,即在草图的顶部:
RConnection c;
void setup() {
try {
c = new RConnection();
c.eval("library('png');library('glmnet')");
}
catch ( REngineException e ) {
e.printStackTrace();
}
}
void draw() {
try {
//you can now use your c variable here
}
catch ( REXPMismatchException rme ) {
rme.printStackTrace();
}
catch ( REngineException e ) {
e.printStackTrace();
}
}
有关 Processing 范围的更多信息,请参见 here。