R, and the many incredibly useful packages that have been developed for it, provides a rich environment to do statistical computing. To access any of this, however, we'll need to be able to call functions from Clojure. We do this by constructing R expressions as strings, sending them to the R server, and getting the results back. The Rserve Java library helps us convert the results to Java objects that we can access.
We must first complete the recipe, Setting up R to talk to Clojure, and have Rserve running. We must also have the Clojure-specific parts of that recipe done and the connection to Rserve made.
Once we have a connection to Rserver, we can call functions by passing the complete call—function and arguments—to the server as a string and evaluating it. Then, we have to pull the results back out, as follows:
user=> (map #(.asDouble %) (.. *r-cxn* (eval "qr(c(1,2,3,4,5,6,7))") asList)) (-11.832159566199232 1.0 1.0845154254728517 1.0)
To call an R function, we make a series of method calls on the RConnection
object that we created in Setting up R to talk to Clojure. The first call, eval
, takes the code to evaluate as a string and passes it to R.
Next, we have to convert the output to a Clojure data structure. We first call asList
on the result, which converts it to a type that implements java.lag.Iterable
. This can be passed to map
, which is used to convert the list's members to doubles.
The example in this recipe called the R function qr
. This calculates the QR decomposition of a matrix. For more information on this function, see http://www.math.montana.edu/Rweb/Rhelp/qr.html.