News combit Dev Blog

Grenzen überschreiten mit benutzerdefinierter Ausgabe für Rscript

Veröffentlicht: Donnerstag, 28. November 2019 | 0 Kommentar(e)
 
Während für Standardaufgaben der Standardmechanismus für das Rscript-Rendering von List & Label ausreicht und bequem ist, um die png-, jpeg- oder svg-Diagrammausgabe aus einem Rscript on the fly automatisch zu generieren, kann es Situationen geben, in denen Sie einfach mehr Kontrolle wünschen.

Aus diesem Grund haben wir den Rscript-Workflow um einen benutzerdefinierten Ausgabemechanismus erweitert, der einfach definiert, welche Ausgabe direkt durch den Skriptcode des Benutzers erzeugt werden soll und somit die automatische Codegenerierung umgeht.



Die Verwendung ist einfach, wir müssen zunächst nur festlegen, was wir mit unserem Skript erzeugen wollen und fangen dann an, den Skriptcode zu schreiben, während wir einige gängige Platzhalter verwenden (siehe Tabelle unten).

Unterstützte Platzhalter:

<!--RSCRIPTOUTFILE--> Vollständiger Dateiname einer Bilddatei
<!--RSCRIPTOUTFILEDIR--> Gesplitteter Dateiname
<!--RSCRIPTOUTFILENAME--> Gesplitteter Dateiname
<!--RSCRIPTOUTFILEEXT--> Gesplitteter Dateiname
<!--RSCRIPTOUTFILENAMEBASE--> Gesplitteter Dateiname
<!--RSCRIPTCUSTOMTYPE--> Die ausgewählte benutzerdefinierte Ausgabeart
<!--RSCRIPTEXPORTFORMAT--> Das aktuelle Exportformat, das ggf. verwendet wird, z.B. "XHTML"
<!--RSCRIPTHEIGHT--> Höhe des LL Objekts für Rscript
<!--RSCRIPTWIDTH--> Breite des LL Objekts für Rscript

Wenn Sie nur ein statisches, aber benutzerdefiniertes Bild benötigen, wählen Sie einfach "Ja, Ausgabeformat" und stellen Sie sicher, dass die Datei <!--RSCRIPTOUTFILE--> existiert, wenn Sie mit dem Skript fertig sind.

Ein etwas komplexerer, aber potenziell häufigerer Anwendungsfall der benutzerdefinierten Ausgabefunktion könnte der Export von HTML5 mit dynamischen Elementen sein. Zusätzlich kann es notwendig sein, ein weiteres statisches Bild für jede andere Art von Druck zu erzeugen, z.B. durch die Erstellung von Screenshots.

Betrachten Sie es als einen Durchleitungsmechanismus für beliebige HTML-Dateien in den XHTML-Exporter. Sie können einfach "Ausgabeformatormat + JSON" in der Konfiguration wählen, was erfordert, dass Sie ein Bild sowie eine zusätzliche JSON-Datei erzeugen, die Informationen darüber angibt, was noch vom Skript erstellt und bereitgestellt wurde.

Um es einfach zu halten und uns weniger auf den Diagramm-Inhalt als auf den Mechanismus selbst in diesem Blogbeitrag zu konzentrieren, erstellen wir eine einfache Karte mit einem Marker am combit-Standort. Vergessen Sie nicht, die Echtdatenvorschau aus Performance-Gründen auszuschalten.



Für ein wenig Flexibilität benötigen wir zuerst einige Definitionen und Variablen.





Werfen Sie nun einen Blick auf den Skriptcode, der die folgende Ausgabe für den XHTML-Export erzeugt, aber nur das R-Logo für einen anderen Typ anzeigt.



# library includes
library(plotly)
library(stringr)
library(jsonlite)
library(leaflet)

# change of working dir
savewd <-getwd()
setwd("<!--RSCRIPTOUTFILEDIR-->")

# just copy a dummy image if needed, which is the case for any type but “Only JSON”
# sloppy, but we don't care for type here and just get it from our R homedir. LL will be happy with a different image type too.

if(!(<!--RSCRIPTCUSTOMTYPE--> == 3)){
 file.copy(str_c(R.home("doc"), "/html/logo.jpg"), "<!--RSCRIPTOUTFILE-->", overwrite = TRUE)
}

# save html and JSON only if needed
if((<!--RSCRIPTCUSTOMTYPE--> > 1) && ("<!--RSCRIPTEXPORTFORMAT-->" == "XHTML")){

# create the leaflet
 p <- leaflet() %>%
   addTiles() %>%  # Add default OpenStreetMap map tiles
   addMarkers(lng=Var$PlaceLNG, lat=Var$PlaceLAT, popup= Var$PlaceName)

# save html
 fnWidget <- "widgets"
 htmlwidgets::saveWidget(as_widget(p), file = str_c("<!--RSCRIPTOUTFILENAMEBASE-->",".html"), selfcontained = FALSE, libdir = fnWidget)

# create and save the JSON
  write(toJSON(data.frame(
   group = c("xhtml", "xhtml"),
   type = c(0,1),
   flags = c(0,23),
   name = c(str_c("<!--RSCRIPTOUTFILEDIR-->", "<!--RSCRIPTOUTFILENAMEBASE-->",".html"), fnWidget))),
   str_c("<!--RSCRIPTOUTFILENAMEBASE-->",".json"))
}

# back to work
setwd(savewd)

Wie Sie in diesem Beispiel sehen können, wird die HTML-Datei nicht in einer eigenständigen Weise erstellt, sondern verwendet einen gemeinsamen Widget-Ordner. Die Installation von Pandoc wäre erforderlich, um auch eine eigenständige Ausgabe zu unterstützen.

Eine einfache JSON-Datei wird verwendet, um mit dem Exportmodul zu kommunizieren, das aus einem oder mehreren Einträgen mit Gruppen-, Typ-, Kennzeichen- und Dateinameninformationen besteht. Während sich der erste Eintrag auf die generierte HTML-Datei bezieht, referenziert der zweite Eintrag das gemeinsame Widget-Verzeichnis. Eine detailliertere Beschreibung der Flags finden Sie in der Referenz.

Durch einfaches Ersetzen von Code im Abschnitt # create the leaflet können wir nun eine Vielzahl von verschiedenen dynamischen Widgets erstellen, die durch die Daten unterstützt werden, die dem Skript zuvor von List & Label zur Verfügung gestellt wurden. Diese könnten wiederum so zusammengesetzt werden, dass entweder Dashboards mit mehreren Rscripts oder ein einzelnes Rscript erstellt werden, das R-spezifische Subplot- oder Dashboard-Funktionen nutzt.




Autor: Jochen Bartlau
Entwicklungsleiter List & Label

Jochen Bartlau leitet als Geschäftsführer die Softwareentwicklung bei combit. Microsoft .NET und Agiles Projektmanagement sind zwei seiner Steckenpferde. Der technikbegeisterte Physiker verbringt seine Freizeit am liebsten mit seiner Familie.


  


Kommentare


Aktuell gibt es noch keine Kommentare zu diesem Blogbeitrag.

Ergänzen Sie hier Ihren Kommentar
 
 
 
 
 
+49 (0) 7531 90 60 10