Et pour publier ses données sur le web ??

Du coté de l'écosystème R on pense forcémment à Shiny :

  • parfait pour un prototypage rapide ou partager le résultat d'analyses
  • applications web facilement "réactives"
  • ...

D'une part des solutions similaires existent en Python, c'est notamment le cas de Dash (qui est basé sur Plotly) et d'autres frameworks qui semblent moins aboutis (gleam, etc.).

Dash : https://dash.plot.ly/

Installation :

pip3 install dash dash-daq
  • Point fort : utilisation de la syntaxe déclarative de Plot.ly
# dash_example.py

import dash
import dash_core_components as dcc
import dash_html_components as html

app = dash.Dash()

app.layout = html.Div(children=[
    html.Div(children='Demo chart'),
    dcc.Graph(
        id='graphss',
        figure={
            'data': [
                {'x':[1,2,3,4,5,6,7], 'y':[11,12,22,23,24,44,55], 'type':'line', 'name':'Energy'},
                {'x':[1,2,3,4,5,6,7], 'y':[13,15,26,27,34,44,65], 'type':'bar', 'name':'Time'},
            ],
            'layout': {
                'title': 'Graph for Time and Energy'
            }
        }
    )
])

Si on a peu ou pas besoin de la réactivité offerte par Shiny ou si on est prêt à écrire quelques lignes de codes supplémentaires, on pourra commencer à utiliser de "vrais" frameworks web comme Python en offre :

  • flask
  • aiohttp
  • hug
  • django
  • ...

Dans ce cas, des bibliothèques puissantes existent notamment pour :

  • gérer les communications avec la base de données (en établissant un mappage entre le modèle de données utilisé par la page web et celui contenu dans la base de données utilisées, pour éviter d'écrire manuellement du SQL par exemple),
  • effectuer le templetage coté serveur (Jinja 2, etc.),
  • gérer les sessions et l'authentification des utilisateurs.

Créer rapidement une API REST

En R des solutions comme plumber vont permettre d'exposer facilement des fonctionnalités R en les annotant :

# with_plumber.R

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

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

# main.R

library(plumber)
r <- plumb("with_plumber.R")
r$run(port=8080)

Des solutions similaires existent en Python.

Hug : http://www.hug.rest/

L'exemple précédent pourra par exemple être écrit de la façon suivante en utilisant ce framework et en utilisant des décorateurs sur nos fonctions.

Installation requise de hug au préalable :

pip3 install hug
In [1]:
# with_hug.py

import hug
import numpy as np

@hug.get(examples='samples=100')
def mean(samples: hug.types.number = 10):
    data = np.random.randn(samples)
    return data.mean()

@hug.post()
def sum(a: hug.types.number, b: hug.types.number):
    return a + b

Dans un terminal :

  • Serveur de developpement :
hug -f with_hug.py
  • Avec un serveur wsgi :
gunicorn with_hug:__hug_wsgi__

Tester le résultat

curl -X POST -F "a=1" -F "b=12" localhost:8000/sum

Partie suivante ...

8. Discussion