web-dev-qa-db-fra.com

Création d'une API RESTful à l'aide de R

Je pense à construire une API RESTful en utilisant le langage de programmation [~ # ~] r [~ # ~] , principalement pour exposer mon modèle d'apprentissage automatique à l'utilisateur dans un format API. Je sais qu'il existe des options comme l'exportation vers PMML, PFA et l'utilisation d'autres langues pour prendre en charge la partie API. Cependant, je veux m'en tenir au même langage de programmation et je me demandais s'il y avait quelque chose comme le framework Flask/Django/Springbook dans R?

J'ai jeté un coup d'œil à servr / brillant mais je ne pense vraiment pas que RESTful soit ce pour quoi ils sont conçus. Y a-t-il une meilleure solution dans [~ # ~] r [~ # ~] qui est plus facile à utiliser?

28
B.Mr.W.

J'ai deux options pour vous:

plombier

plombier vous permet de créer une API REST en décorant votre code source R existant avec des commentaires spéciaux.

Un petit exemple de fichier:

# myfile.R

#* @get /mean
normalMean <- function(samples=10){
  data <- rnorm(samples)
  mean(data)
}

#* @post /sum
addTwo <- function(a, b){
  as.numeric(a) + as.numeric(b)
}

Depuis la ligne de commande R:

> library(plumber)
> r <- plumb("myfile.R")  # Where 'myfile.R' is the location of the file shown above
> r$run(port=8000)

Avec cela, vous obtiendriez des résultats comme celui-ci:

$ curl "http://localhost:8000/mean"
 [-0.254]
$ curl "http://localhost:8000/mean?samples=10000"
 [-0.0038]

Cruche

Jug est un petit framework de développement web pour R qui s'appuie fortement sur le package httpuv. L'objectif principal est de rendre la création d'API pour votre code aussi simple que possible. Il n'est pas censé être un framework web particulièrement performant ni uber stable. D'autres outils (et langues) pourraient être plus adaptés à cela. Son objectif principal est de vous permettre facilement de créer des API pour votre code R. Cependant, la flexibilité de Jug signifie que, en théorie, vous pourriez construire un framework web étendu avec lui.

Il est très facile à apprendre et possède une Nice vignette .

Un exemple Hello-World:

library(jug)

jug() %>%
  get("/", function(req, res, err){
    "Hello World!"
  }) %>%
  simple_error_handler_json() %>%
  serve_it()
29
nnn

C'est pour ceux qui veulent avoir une comparaison du développement d'API avec R-plombier, Rserve et rApache.

Fondamentalement, les demandes simultanées sont mises en file d'attente par httpuv dans plumber afin qu'elles ne soient pas performantes par elles-mêmes. L'auteur recommande plusieurs conteneurs Docker, mais cela peut être compliqué et exiger des réponses.

Il existe d'autres technologies, par exemple Rserve et rApache. Rserve forks les processus et il est possible de configurer rApache pour pré-fork afin de gérer les requêtes simultanées.

Voir les articles suivants pour comparaison

https://www.linkedin.com/Pulse/api-development-r-part-i-jaehyeon-kim/https://www.linkedin.com/Pulse/api -development-r-part-ii-jaehyeon-kim /

4
Jaehyeon Kim

Ajout opencp à cette liste de réponses:

Ne consultez OpenCP par Jeroen Ooms.

Avantages:

  1. Simple et direct : Tout package R installé sur le serveur opencpu peut être appelé via http.

  2. Juste concentrez-vous sur la création du package R et opencpu se chargera du reste.

  3. Vous pouvez renvoyer un tableau relationnel des résultats , un tracé , valeur unique ou même un pointeur (alias une clé de session temporaire) vers un R objet [imaginez un énorme objet/ensemble de données que vous pouvez traiter/manipuler à partir d'une autre plateforme plus limitée;)]

  4. CI/CD avec votre package hébergé sur Github.

  5. Si vous utilisez la version serveur, opencpu est simultané et asynchrone par conception grâce à l'utilisation de Nginx pour la mise en cache et l'équilibrage de charge .

  6. Utilisez AppArmor pour appliquer la sécurité sur Ubuntu. Ou si vous utilisez Fedora, vous pouvez configurer l'authentification par certificat public-privé, grâce au serveur Apache au niveau du backend. Merci à rApache!

  7. Les éléments ci-dessus sont trop compliqués : Vous pouvez également démarrer une seule session utilisateur sur votre machine locale en utilisant opencpu::ocpu_start_app() et servir vos fonctions (inconvénient est la sécurité)

  8. Besoin d'une interface utilisateur ? Créez simplement une interface utilisateur en utilisant javascript, stockez-la dans le dossier www du package R et l'utilisateur peut l'ouvrir sur son navigateur Web et utiliser vos fonctions.

Ce message ne rend pas justice à ciel ouvert. Je vous recommande vraiment de lire ses liens en haut de OpenCP

Avoir une solution avec https://cloud.opencpu.org/ocpu/test ou https://www.opencpu.org/apps.html

3
chinsoon12