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?
Vorschläge zum Erstellen von R-Server-REST-APIs, die ich von einer externen App aus aufrufen kann?
Antwort
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')");
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
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. –
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.
das ist, was ich gesucht habe! Vielen Dank – jangorecki
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
Jede Chance für generische 'Curl'-Schnittstelle? wie in der Bounty beschrieben. – jangorecki
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