Since RCaller creates an Rscript process for each single run, it is said to be in-efficient for most cases. But there are useful non-hack methods to improve the method. Suppose that your aim is to calculate medians of two double vector like this:
@Test
public void singleResultTest() {
double delta = 0.0000001;
RCaller rcaller = new RCaller();
rcaller.setRscriptExecutable("/usr/bin/Rscript");
rcaller.cleanRCode();
rcaller.addRCode("x <- c(6 ,8, 3.4, 1, 2)");
rcaller.addRCode("med <- median(x)");
rcaller.runAndReturnResult("med");
double[] result = rcaller.getParser().getAsDoubleArray("med");
assertEquals(result[0], 3.4, delta);
}
However, this example considers only computing the median of x, effort for computing medians of three variables needs three process which is very slow. Lists are "vector of vector" objects but they are different from matrices. A list object in R can handle several types of vector with their names. For example
alist <- list (
s = c("string1", "string2", "string3") ,
i = c(5,4,7,6),
d = c(5.5, 6.7, 8.9)
)
the list object
alist is formed by three different kind of vectors: string vector s, integer vector i and double vector d. Also their names are s, i and d, respectively. Accessing elements of this list is straightforward. There are two ways to access to elements. First one is conventional way using indices. When the example above runs, strvec is set to String vector s.
alist <- list (
strvec <- alist[1]
While a list object can handle R objects with their names, we can handle more than more result in a single RCaller run. Back to our example, we wanted to calculate medians of three double vectors in a single run.
@Test
public void TestLists2()throws Exception {
double delta = 0.0000001;
RCaller rcaller = new RCaller();
rcaller.setRscriptExecutable("/usr/bin/Rscript");
rcaller.cleanRCode();
rcaller.addRCode("x <- c(6 ,8, 3.4, 1, 2)");
rcaller.addRCode("med1 <- median(x)");
rcaller.addRCode("y <- c(16 ,18, 13.4, 11,12)");
rcaller.addRCode("med2 <- median(y)");
rcaller.addRCode("z <- c(116 ,118, 113.4,111,112)");
rcaller.addRCode("med3 <- median(z)");
rcaller.addRCode("results <- list(m1 = med1, m2 = med2, m3 = med3)");
rcaller.runAndReturnResult("results");
double[] result = rcaller.getParser().getAsDoubleArray("m1");
assertEquals(result[0], 3.4, delta);
result = rcaller.getParser().getAsDoubleArray("m2");
assertEquals(result[0], 13.4, delta);
result = rcaller.getParser().getAsDoubleArray("m3");
assertEquals(result[0], 113.4, delta);
}
This code passes the tests. By the result at hand, we have three medians of three different vectors with one pass calculation. With this way, an huge number of vectors can be accepted as a result from R and this method may be considered efficient...
these test files were integrated to source structure of project in
http://code.google.com/p/rcaller/
hope works!