Предложения, необходимые для создания REST API REST, который я могу вызывать из внешнего приложения?

Я видел много статей о потреблении данных в R из других сервисов RESTful API, но я действительно пытался найти какие-либо статьи об обратном. Я заинтересован в том, чтобы R был сервером, а не клиентом. Я хотел бы, чтобы приложение Node.js вызывало RESTful API R-сервера, поэтому я могу использовать определенные аналитические функции, такие как прогнозирование с несколькими сезонными сроками. У кого-нибудь есть идеи?

Ответы

Ответ 1

Вы можете использовать httpuv для запуска базового сервера, а затем обрабатывать запросы GET/POST. Следующее не является "REST" как таковое, но оно должно обеспечивать основную структуру:

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)

У меня есть пакеты httr и RCurl, так как вам, вероятно, придется использовать некоторые биты как для разбора/форматирования/etc запросов и ответов.

Ответ 2

node-rio предоставляет возможность поговорить с rserve (сервером TCP/IP, который позволяет использовать R-функции) от node.js.

Вот пример использования (из документации):

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