One of R's strengths is its plotting ability. In this recipe, we'll see how to take some data and plot it on a graph. We won't really exercise R's graphic abilities, but this should be enough to get you started.
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.
We'll need the ToR
protocol and the implementations that we defined in the Passing vectors into R recipe.
Also, we'll need access to the java.io.File
class:
(import '[java.io File])
This recipe will look a lot like a number of other R-related recipes. We'll create a function that assembles the string with the R expression and then we'll see it in action.
(defn r-plot ([data filename] (r-plot data filename *r-cxn*)) ([data filename r-cxn] (.. r-cxn (eval (str "png(filename="" (.getAbsolutePath (File. filename)) "", height=300, width=250, bg="white") " "plot(" (->r data) ") " "dev.off() ")))))
user=> (r-plot [1.0 1.0 2.0 3.0 5.0 8.0 11.0] "fib.png") #<REXPInteger org.rosuda.REngine.REXPInteger@7342054+[1]>
If we open up the fib.png
file and take a look at it, we can see the results of the simple graphing call that we made, as shown here:
The body of this function is in the string that gets passed to R to evaluate. It's composed of three function calls. First, it initializes the PNG output with the png
function:
"png(filename="" (.getAbsolutePath (File. filename)) "", height=300, width=500, bg="white") "
Then, we actually plot the data:
"plot(" (->r data) ") "
Finally, save the plot to the file:
"dev.off() "
A scatterplot is a very basic plot, which Incanter can do as well. However, R's graphing features are more sophisticated than what Incanter can currently do. To get a taste of what R's capable of, browse through the R gallery at http://gallery.r-enthusiasts.com/.