top of page

Eine R Shiny Applikation als Desktop-Version für Windows umsetzen

Mit R Shiny (rstudio.com) umgesetzte Web Applikationen sind in der Regel auf den Server-Betrieb ausgelegt. Das heißt, dass ein Server die Web Anwendung hostet und die Benutzer von ihren Rechnern aus über einen Web-Browser auf die Anwendung zugreifen. Um eine für den Benutzer ebenfalls komfortable Desktop-Variante einer R-basierten Web Anwendung zu erstellen (die Anwendung läuft komplett auf dem Rechner des Benutzers), sind ein paar Arbeitsschritte notwendig, die wir hier kurz skizzieren wollen. Grundsätzliches Ziel ist es, dass der Benutzer die Anwendung benutzen kann wie er es von Standard Desktop-Anwendungen gewohnt ist.


Dem Benutzer die Installation von R und R-Bibliotheken sowie weiteren Dependencies ersparen

Damit der Benutzer nicht selbst R auf seinem Rechner installieren muss, ist es nötig, die Basisinstallation von R (z.B. Version 3.4.3; Download hier) sowie die benötigten Pakete bzw. Bibliotheken als Dependencies mitzuliefern. Dies kann relativ einfach erfolgen, indem ein Ordner mit der entsprechenden R Version in das Anwendungsverzeichnis mit aufgenommen wird. So muss der Benutzer lediglich die Anwendung installieren bzw. entpacken, ohne zusätzliche Installationen von Software vorzunehmen, die für ihn unbekannt ist. Wir gehen nun davon aus, dass die für die Ausführung der R Shiny Anwendung nötige R Version im Verzeichnis unter „\dependencies\R-3.4.3“ verfügbar ist. Genauso könnte etwa auch eine benötigte Java Version direkt mit der R Shiny Anwendung mitgeliefert werden.


R Shiny App via .exe ausführen können und keine Kommandozeilenausgabe sehen

Die R Shiny Anwendung wird durch ein runApp.R Skript ausgeführt – egal ob auf dem Server oder in der Desktop-Variante. Das runApp.R Skript selbst wiederum wird durch ein Windows .bat Skript ausgeführt. Dieses .bat Skript befindet sich im Hauptverzeichnis der R Shiny Anwendung und muss folgendermaßen aussehen:


cd /d %~dp0

"dependencies\R-3.4.3\bin\Rscipt.exe" "runApp.R" %~dp0


Die erste Zeile des .bat Skripts sorgt dafür, dass das ausgewählte Verzeichnis das Verzeichnis ist, indem das .bat Skript liegt. Die zweite Zeile nutzt Rscript, um das R Skript runApp.R auszuführen und teilt diesem Skript mit Hilfe des Zusatzes „%~dp0“ mit, aus welchem Verzeichnis das .bat Skript gestartet wurde. Mit Hilfe dieser Information weiß die R Instanz, die die R Shiny Anwendung ausführen wird, in welchem Ordner der Source-Code und die Dependencies für die Anwendung liegen.


Das runApp.R Skript sorgt dafür, dass die R Shiny Anwendung aus dem korrekten Verzeichnis heraus ausgeführt wird und stellt sicher, dass wenn die Anwendung bereits läuft, lediglich ein entsprechende Browser-Tab geöffnet wird. Der Benutzer bemerkt im Zweifel also nicht, ob er die Anwendung startet oder lediglich aufruft. Zusätzlich möglich wäre auch die flexible Auswahl eines freien Ports – dies ist hier aber nicht berücksichtigt. Das runApp.R Skript sieht folgendermaßen aus (siehe auch die Kommentare im Code):


#!/usr/bin/Rscript


#Clean the workspace

rm(list = ls())


#Die folgenden Codezeile speichert in dem Objekt „args“ die dem Skript mitgelieferten Kommandozeilenargumente – dies ist in diesem Fall einfach nur das Verzeichnis aus dem die Anwendung gestartet werden muss

args = commandArgs(trailingOnly=TRUE)


#An dieser Stelle werden hier bereits benötigte R-Bibliotheken geladen

library(shiny)

library(httr)


#Der folgende Code-Block stellt sicher, dass der über das .bat Skript gelieferte Verzeichnispfad das richtige Format für die weitere Verwendung besitzt

length <- length(args)

path <- c()

for (i in 1:length) {

print(args[i])

path <- paste0(path, " ", args[i])

}

path <- substr(path, 2, nchar(path)-1)


#Der folgende Code-Block prüft, ob die R Shiny Anwendung bereits läuft

check_for_running_instance <- 0

try(http_get_result <- GET("http://localhost:8001"), silent=TRUE)

if(exists("http_get_result")) {check_for_running_instance <- 1}


#Läuft die Anwendung nicht bereits, wird sie an dieser Stelle über die runApp() Funktion ausgeführt. Läuft die Anwendung bereits, wird lediglich der Browser geöffnet auf dem Port, auf die Anwendung bereits läuft.

if(check_for_running_instance == 0) {

runApp(path, port=8001, host="0.0.0.0", launch.browser=TRUE)

} else{browseURL("http://localhost:8001")}

Mit einem Tool wie dem Bat_To_Exe_Converter (Download hier) kann nun aus der .bat Datei eine .exe Datei erstellt werden, die die Anwendung unsichtbar, also ohne eine Kommandozeilenausgabe, ausführt. Diese .exe Datei ist am Ende die einzige Datei, die den Benutzer interessieren muss, genauso wie bei Standard Desktop Anwendungen üblich. Mit einem Klick lässt sich die R Shiny Web Anwendung starten, ohne dass der Benutzer von den dafür angestoßenen Prozessen etwas mitbekommt. Auf diesem Wege lässt sich eine R Shiny Anwendung auch als komfortable Desktop Variante umsetzen.

Comments


bottom of page