OpenCPU: een platform om R-code als webservice te hergebruiken

Om (complexe) statistische en wiskundige berekeningen te implementeren is het vaak aangewezen om specifieke programmeertalen en bijhorende omgevingen te gebruiken  zoals bv Matlab, R, SAS of Mathematica. Elk van deze omgeving laat toe om in een beperkt aantal lijnen code berekeningen uit te voeren die moeilijk te realiseren zouden zijn in meer generieke programmeertalen.  Onze eigen ervaringen met verscheidene geavanceerde analyses in R - een open-source programmeertaal en software omgeving voor statistische berekeningen en grafieken - bevestigen dit.

Het gebruiken van specifieke programmeeromgevingen heeft echter ook enkele vervelende nadelen:

  • De output van de berekeningen uitgevoerd in deze programmeeromgevingen dienen vaak gebruikt te worden als input voor een nieuw programma, rapport, webapplicatie, ... .  Dit is vaak een complex gegeven waarbij heel wat configuratie en integratie komt kijken;
  • Analyses en berekeningen kunnen vaak nuttig zijn voor meerdere personen, instellingen, onderzoekers...  Het is weinig flexibel om analyses te delen met de requirement om een hele software stack te installeren.

Om code afkomstig van specifieke programmeeromgevingen makkelijker te delen en te integreren introduceert doctoraatsonderzoeker Jeroen Ooms 'OpenCPU'. OpenCPU is een centraal platform waarop men R-scripts kan plaatsen. De scripts die men op OpenCPU plaatst worden vervolgens automatisch beschikbaar als REST-services.  Deze services kan men makkelijk integreren in andere programmas/webapplicaties. Belangrijk is ook te vermelden dat OpenCPU een open-source platform is. Dit maakt het mogelijk om intern een eigen OpenCPU-server op te zetten (met de nodige beveiligingen) en indien nodig te koppelen aan interne achterliggende databases.

OpenCPU Tutorial

Bij wijze van proof-of-concept hebben we getest hoe men OpenCPU kan gebruiken om een bar-chart analyse te genereren in een web-applicatie. De stappen die we hierbij ondernomen hebben staan hieronder opgesomd.

Stap 1: Verzamel en upload de nodige data

In deze proof-of-concept analyseren we het klantenbestand van bedrijf X. Elke klant heeft een bepaalde Importance code van 1 tot 9 (1=een klant met weinig opbrengst, 9 een klant met heel veel opbrengst). Per klant houdt men ook bij of  hij makkelijk beschikbaar is voor een telefonische enquete (Y=yes,N=no). Onderstaande tabel geeft deze twee dimensies weer, gekoppeld aan het aantal klanten (Frequency) die in deze categoriëen kunnen ondergebracht worden.

Importance Available Frequency
1 N 557238
2 N 53354
3 N 27857
4 N 18746
5 N 5575
6 N 2717
7 N 1702
8 N 547
9 N 504
1 Y 132551
2 Y 19218
3 Y 10332
4 Y 5881
5 Y 1469
6 Y 478
7 Y 142
8 Y 26
9 Y 5

Bovenstaande data kan men uploaden als CSV-file (of ander formaat) op de OpenCPU server via volgende link. Eens de data geupload is krijgt men een unieke ID terug waar de data te vinden is.

Stap 2: Creëer en save het R-script

In een volgende stap willen we een barchart genereren die per Importance-code weergeeft hoeveel klanten er zijn, en elke bar inkleurt in twee vlakken: een vlak makkelijk beschikbare klanten en een vlak met moeilijk beschikbare. Deze grafiek genereren we met de ggplot2 library. Onderstaande code omvat het complete R-script:

#Include ggplot 2 library
library("ggplot2"); 
#Haal de geuploade data op (zie stap1, de DATAID is dezelfde als uit deze stap) 
myTable <- read.csv("http://public.opencpu.org/R/tmp/DATAID/csv?");
#Plot en print te barchart
pl <- ggplot(myTable, aes(x = Importance, y = Frequency,fill=Available) ) + geom_bar(stat="identity");
print(pl);

Dit script zetten we op de OpenCPU-server via volgende link, we kiezen voor de optie 'save to store'. Deze code krijgt ook een unieke ID, dewelke we later kunnen gebruiken om de code uit te voeren via een REST-service.

Stap 3: Maak de web-applicate met de REST service

De bar-chart die we gemaakt hebben in het R-script willen we nu tonen in een web-applicatie. Dit doen we via een eenvoudige Javascript applicatie die de OpenCPU-REST webservice aanroept. OpenCPU biedt verscheidene webservices aan om een plot te laden: als pdf, png, svg, R-file, ... Wij hebben hier gekozen om de plot in te laten als SVG. Onderstaand is de source-code  en een screenshot van de webapplicatie weergegeven (de status na het klikken op de "calculate graph" button).

 

<html>
 <head>
 <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js"  type="text/javascript">
 </script>
 
 <script type="text/javascript"> 
     $(document).ready(function() { 
          $("button").click( 
                 function(){ 
                      $("#svg").load("http://public.opencpu.org/R/tmp/SCRIPTOPENCPUID/svg", function() {});
                 } 
          );
     }); 
 </script>
 
 </head>
 <body>
   
   <button>Calculate graph</button> 
   <div id="svg"> </div>
   
 </body>
 </html>

 

Besluit

Specifieke softwarepakketten en programmeertalen zijn handig om in enkele lijnen code complexe berekeningen uit te voeren. Het is echter moeilijk om deze scripts te koppelen met bestaande code en te delen met verschillende mensen. Als oplossing voor dit probleem kunnen we OpenCPU gebruiken, een opensource server waar R-code op gepusht kan worden en vervolgens kan aangeroepen worden als REST-service. In een tutorial toonden we aan hoe deze aanpak werkt.  Er zijn ook nog 2 blogposts die deze aanpak beschrijven: embedding a plot in your website en running a block of R-code in OpenCPU.

 

Leave a Reply

Your email address will not be published.