I've seen lots of articles about consuming data in R from other RESTful API services, but I have really struggled to find any articles about the reverse. I'm interested in R being the server, and not the client. I'd like a Node.js app to call a RESTful API of an R-server so I can leverage specific analytical functions such as multi-seasonality forecasting. Anyone have any ideas?
Suggestions needed for building R server REST API's that I can call from external app?
You can use httpuv
to fire up a basic server then handle the GET
/POST
requests. The following isn't "REST" per se, but it should provide the basic framework:
library(httpuv)
library(RCurl)
library(httr)
app <- list(call=function(req) {
query <- req$QUERY_STRING
qs <- httr:::parse_query(gsub("^\\?", "", query))
status <- 200L
headers <- list('Content-Type' = 'text/html')
if (!is.character(query) || identical(query, "")) {
body <- "\r\n<html><body></body></html>"
} else {
body <- sprintf("\r\n<html><body>a=%s</body></html>", qs$a)
}
ret <- list(status=status,
headers=headers,
body=body)
return(ret)
})
message("Starting server...")
server <- startServer("127.0.0.1", 8000, app=app)
on.exit(stopServer(server))
while(TRUE) {
service()
Sys.sleep(0.001)
}
stopServer(server)
I have the httr
and RCurl
packages in there since you'll probably end up needing to use some bits of both to parse/format/etc requests & responses.
node-rio provides a way to talk to rserve (a TCP/IP server that allows the use of R functions) from node.js.
Here is an example of use (from the documentation):
var rio = require('rio');
rio.evaluate("as.character('Hello World')");
Thanks! I found that later yesterday as well and got the basic evaluate method to work. Having trouble on the sourceAndEvaluate method when I have to pass in variables. Can you help on something as simple as: testFunction <- function(a,b) { return a+b } ? I figured out how to step debugging through it sourcing this function by path, but I can't figure out how to parameterize data IO with the function. Any ideas? –
Pileum
Sorry, I am not too familiar with the actual working of node js. I mostly just know rserve. I would open up a new question. –
Intoxicate
© 2022 - 2024 — McMap. All rights reserved.
curl
interface? as described in the bounty. – Jury