2014-03-04 16 views
18

Ich habe viele Artikel über den Konsum von Daten in R von anderen RESTful API Services gesehen, aber ich habe wirklich Mühe gehabt, Artikel über das Gegenteil zu finden. Ich bin daran interessiert, dass R der Server ist und nicht der Client. Ich möchte, dass eine Node.js-App eine REST-konforme API eines R-Servers aufruft, damit ich bestimmte analytische Funktionen wie Multi-Saisonalitätsprognosen nutzen kann. Hat jemand Ideen?Vorschläge zum Erstellen von R-Server-REST-APIs, die ich von einer externen App aus aufrufen kann?

+3

Dies ist so ziemlich die umfangreichste Option, die ich in diesem Bereich gesehen habe, aber es gibt ein halbes Dutzend Alternativen: https://www.opencpu.org/ – Hansi

+0

Jede Chance für generische 'Curl'-Schnittstelle? wie in der Bounty beschrieben. – jangorecki

+0

Haben Sie sich die Dokumente für OpenCPU angesehen? Ganz oben auf der API-Seite heißt es explizit: * "viele der folgenden Abschnitte enthalten Beispiele zum Einrollen" *. – r2evans

Antwort

6

node-rio bietet eine Möglichkeit, mit rserve (ein TCP/IP-Server, der die Verwendung von R-Funktionen ermöglicht) von node.js zu sprechen. Hier

ist ein Beispiel für die Verwendung (aus der Dokumentation):

var rio = require('rio'); 
rio.evaluate("as.character('Hello World')"); 
+0

Danke! Das habe ich später auch gestern gefunden und habe die grundlegende evaluate Methode zum arbeiten bekommen. Probleme mit der sourceAndEvaluate-Methode, wenn ich Variablen übergeben muss. Können Sie etwas so Einfaches wie: testFunction <- function (a, b) {return a + b}? Ich habe herausgefunden, wie man das Debugging durchläuft, indem ich diese Funktion nach Pfad sortiere, aber ich kann nicht herausfinden, wie man IO mit der Funktion parametrisiert. Irgendwelche Ideen? – Mark

+0

Tut mir leid, ich bin nicht vertraut mit der tatsächlichen Arbeit von Node js. Ich kenne meistens nur rserve. Ich würde eine neue Frage aufwerfen. –

21

können Sie httpuv verwenden, um einen grundlegenden Server dann die GET/POST Anfragen bearbeiten zu feuern. Das Folgende ist nicht „Rest“ per se, aber es sollte das Grundgerüst liefern:

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) 

Ich habe die httr und RCurl Pakete dort, da Sie wahrscheinlich am Ende brauchen werden einige Bits von beiden zu verwenden, um parse/format/etc Anfragen & Antworten.

+0

das ist, was ich gesucht habe! Vielen Dank – jangorecki