Calling R functions from Clojure

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.

Getting ready

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.

How to do it…

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)

How it works…

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.

There's more…

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.

..................Content has been hidden....................

You can't read the all page of ebook, please click here login for view all page.
Reset
18.225.149.238