Jug stands for Just Unified Galloping. Okay, okay, it’s just a play on words coming from a Flask (Python) background.

Jug is my attempt to create a simple small web framework that allows you to turn your (existing) R functions into an API. Having the wonderful httpuv package at my disposal made this very easy for me.

So, how does this work?

Let’s say I have the following function:

say_hello_to<-function(name) paste("Hello", name)


Sometimes you would be in a situation where you want to send a GET request to a server and let a function (let’s say the one above) return it’s result. Thus, I want to expose the above function to allow HTTP GET requests to acces it. Using Jug I could do something like this:

library(jug)

jug() %>%
gett("/", decorate(say_hello_to)) %>%
serve_it()

Serving the jug at http://127.0.0.1:8080


However, when I run this code and post a GET request to the URL, the following happens:

$curl 127.0.0.1:8080 ERROR: argument "name" is missing, with no default  Obviously, because the function say_hello_to requires the parameter name. A second attempt has better results: $ curl 127.0.0.1:8080/?name=Bart
Hello Bart


However, besides exposing exsting fuctions, Jug is quite flexible. It has a middleware system, which allows to build up a (http) web server layer by layer. For example:

my_first_name<-NULL
my_last_name<-NULL

jug() %>%
postt("/", function(req, res){
my_first_name<<-req$post$first_name
my_last_name<<-req$post$last_name
return(TRUE)
}) %>%
gett("/", function(req, res){
paste("Hello",my_first_name, my_last_name)
}) %>%
serve_it()


$curl --data "first_name=Bart&last_name=Blitzers" 127.0.0.1:8080 ☺  $ curl http://127.0.0.1:8080
Hello Bart Blitzers


So, enough for now. More on this later…

A (very) early version can be found at github.com/Bart6114/jug.