Database Reference
In-Depth Information
2.
Then we'll import a couple of namespaces from them into our script or REPL:
(import '[org.rosuda.REngine REngine]
'[org.rosuda.REngine.Rserve RConnection])
3.
Finally, we create a connection to the R server. This will be a dynamic variable,
so we can swap it out easily later. If the Rserve isn't running, this step will fail, so
make sure that you have the Rserver running before you execute this (see step 6
from the previous section), and if this succeeds, you have R and Clojure successfully
communicating:
(def ^:dynamic *r-cxn* (RConnection.))
How it works…
The Rserve package runs a server in the background where the Java library communicates
with. From Clojure, we can now feed data to the Rserver and get results. We'll see examples of
this in the following recipes.
Because Rserve has to be running, step 6 from the previous section (load and start the
Rserver) has to be performed in every session you want to call R from Clojure.
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 irst complete the recipe, Setting up R to talk to Clojure , and have Rserve running.
We must also have the Clojure-speciic 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)
 
Search WWH ::




Custom Search