letzte Änderung:
15. März 2024 17:52:56
Frank Fuhlbrücks Seiten (IT und FOSS)

DE/EN

R im Uberspace (nur unter U6 getestet)

Ziel dieser Anleitung ist die Installation von R im Uberspace sowie ein einfaches Beispiel zur Nutzung.

Was ist Uberspace?

Uberspace ist ein Shared-Hosting-Anbieter (bei dem auch diese Seiten liegen), der es erlaubt nahezu beliebige Anwendungen auszuführen und damit zwischen „normalem“ Shared-Hosting und vServer liegt. Somit muss man sich nicht um den HTTP-Server oder MTA und dergleichen kümmern, dafür sind aber meist ein paar Anpassungen nötig, um Software im eigenen Home-Verzeichnis zu installieren. Glücklicherweise haben die R-Entwickler an solche und ähnliche Szenarien gedacht (s.u.).

Was ist R?

R ist eine multiparadigmatische Programmiersprache, die vor allem für Statistik genutzt wird, mittlerweile existieren aber Pakete für verschiedenste Zwecke.

Vorbereitungen

R benötigt Fortran. Das mag altmodisch wirken, für viele numerische Verfahren existieren aber gute und erprobte Fortranimplementierungen, auf die R so mit wenig glue-Code zurückgreifen kann. Da Fortran wohl nicht zu den beliebtesten Sprachen für Webentwickler zählt, ist gfortran nicht auf den Uberspace-Servern installiert. Wir installieren es per yumdownloader:

USER=das_bist_du
#gehe in beliebiges Verzeichnis, 
#wo temporär Installationsdateien gelagert werden
cd /home/${USER},/install 
#lade die Pakete herunter,die auch yum laden würde
yumdownloader gcc-gfortran libgfortran.x86_64 
#erstelle das und wechsle ins Verzeichnis für Fortran
mkdir -p /home/${USER},/fortran
cd /home/${USER},/fortran
#wandle rpm zu cpio und packe hier aus (statt /)
rpm2cpio ../install/gcc-gfortran-4.4.6-4.el6.x86_64.rpm | cpio -id
rpm2cpio ../install/libgfortran-4.4.6-4.el6.x86_64.rpm | cpio -id
R bauen und installieren

Zunächst suchen wir uns einen CRAN-Mirror aus, von dem wir die aktuelle Version laden wollen und speichern den Link zum tar.gz. Sind alle Compiler und Bibliotheken vorhanden (was nun der Fall ist), lässt sich R leicht ins Benutzerverzeichnis installieren, nur der übliche Parameter --prefix ist nötig. Zusätzlich geben wir noch an, wo Fortran und seine Bibliotheken liegen (C/C.... sind global installiert). Wer plant RInside oder FastRWeb zu nutzen, sollte noch --enable-R-static-lib oder --enable-R-shlib hinzufügen, um die statische oder dynamische Bibliothek von R zu bauen:

#Zielverzeichnis für R
mkdir -p /home/${USER},/R
cd /home/${USER},/install
#lade die aktuelle Version von einem CRAN-Mirror:
wget http://R-MIRROR...../cran/src/base/R-2/R-......tar.gz
#entpacke das Archiv und wechsle ins oberste Quellverzeichnis
tar xf R-......tar.gz
cd R-.....
#configure, make, make install mit oben angesprochenen Parametern
PATH=${PATH}:/home/${USER}/fortran/usr/bin/ \\
  LDFLAGS=-L/home/${USER}/fortran/usr/lib64  \\
  ./configure --prefix=/home/${USER},/R --enable-R-static-lib
make
make install
CGI-Skript zum plotten

Eine der Stärken von R sind Graphiken. Wir erstellen nun einfaches CGI-Skript, dass Daten per GET annimmt, einen Plot in eine SVG-Datei erzeugt und diese auf der Standardausgabe ausgibt und damit an den Client sendet. Für eine produktive Umgebung sind FastCGI und Empfang per POST besser, aber zur Erläuterung bietet diese Variante den geringsten Overhead.

cat > /var/www/virtual/${USER}/cgi-bin/plotR <<__EOF__
#!/home/$USER/R/bin/Rscript --vanilla

#eine Liste erlaubter Funktionen 
allowedFcts = c(plot,boxplot),
#Wir setzten die Namen zum indizieren
names(allowedFcts) = c(\"plot\",\"boxplot\"),
#Der Querystring enthält Funktion&Daten(codiert)
#das Ergebnis ist eine Liste, wir wollen nur den 1. Vektor:
qstringparts = strsplit(Sys.getenv(\"QUERY_STRING\",
    unset=NA),\"&\",fixed=TRUE)[[1]]
#Ist die Funktion \"available\",
#so gib die Namen der Funktionen aus (getrennt durch \",\")
if(qstringparts[1] == \"available\"){
        cat(\"Content-Type: text/plain\\n\\n\")
        cat(paste(names(allowedFcts),collapse=\",\")),
        quit()
}
#Dekodieren der Daten und Auswahl der Funktion
dat=URLdecode(qstringparts[2])
fct=allowedFcts[[qstringparts[1]]]


if(!is.null(fct)){
    #diesmal antworten wir mit einer SVG
        cat(\"Content-Type= image/svg..xml\\n\\n\")
        #leider kann svg nicht auf stdout plotten
        #daher ist eine temporäre Datei nötig
        fn=tempfile()
        svg(fn)
        #wir lesen die Daten in einen data.frame mit read.csv
        #und wenden die Funktion darauf an 
        fct(read.csv(textConnection(dat),sep=\",\"))
        #SVG-Ausgabe abschalten 
        #(und Statusmeldung an stdout verhindern mit Zuweisung)
        unused = dev.off()
        #temp. Datei an stdout senden
        cat(readChar(fn, file.info(fn)$size)),
        #temp. Datei löschen
        unlink(fn),
}
__EOF__
chmod ..x /var/www/virtual/${USER}/cgi-bin/plotR
Ausprobieren

Wer einfach mal testen will, was man auf diesem Weg so machen kann, kann sich diese Demo ansehen. Die Plotgraphik in der unteren rechten Ecke hat obiges CGI-Skript als src gesetzt, nachdem auf plot geklickt wurde. Für Mittelwerte etc. und Tests („compute“) wird ein ähnliches CGI-Skript per XmlHttpRequest angesprochen und die Resultate links unten ausgegeben.

Ausblick

Wenn ich Zeit und Lust habe gibt's irgendwann noch eine Anleitung zum Einsatz von FastRWeb oder dergleichen. In Planung ist weiterhin ein Tutorial zum Plotten und Manipulieren von Graphen (i.S.d. Graphentheorie) und eins zur Generierung von Reports mit Webstatistiken. Wer eine übers Internet zugängliche R-shell sucht, siehe hier und gucke da .

background picture