[Biocep-commits] In callAndGetReference the R function is called twice

Kornelius Rohmeyer kornelius.rohmeyer at small-projects.de
Fri Jun 12 15:36:57 CEST 2009


Dear Biocep mailing list,

since there is no documentation yet for RServices perhaps it is as
intended, but the following side effect caused problems for me:

If I use DirectJNI.getInstance().getRServices() and call a function via
call, then it is called only one time.
But if I use callAndGetReference it is called twice.

Here an example:

import java.rmi.RemoteException;
import org.kchine.r.server.RServices;

public class BiocepTest {
  public static void main(String[] args) throws RemoteException {
    RServices rs =
      org.kchine.r.server.DirectJNI.getInstance().getRServices();
    rs.sourceFromBuffer("x<-1;" +
    		" mytest <- function(){print(paste(\"Test\",x));" +
    		" x<<-x+1;}");
    rs.call("mytest");			
    rs.callAndGetReference("mytest");
  }
}

The output is:

call str >>>mytest()
+ ------evalAndGetObject from :mytest()
[1] "Test 1"

call str >>>mytest()
+ ------evalAndGetObject from :mytest()
[1] "Test 2"
[1] "Test 3"

The problem is due to calling the private method
evalAndGetObject(String expression, boolean resultAsReference)
with resultAsReference = true and expression still equal to "mytest()".

The first evaluation of the expression "mytest()" is in the line:
long resultId = e.rniEval(e.rniParse(expression, 1), 0);
But a second evaluation occurs when javaClassName is guessed for the
reference:
String javaClassName = 
  guessJavaClassRef(rclass, resultType, isS3Class(expression));

The whole second evaluation can be avoided by changing this line to:
String javaClassName = 
  guessJavaClassRef(rclass, resultType, isS3Class(resultvar));

I would be very glad if you would accept this patch.

Best regards, Kornelius Rohmeyer.



More information about the Biocep-commits mailing list