Programmiersprache R: Shiny 1.6 glänzt mit neuem Caching und Developer Mode
Mit dem auf R basierenden Framework lassen sich webbasierte Benutzeroberflächen für die Datenanalyse erstellen, Version 1.6 wartet mit Theming-Varianten auf.
- Silke Hahn
Shiny, ein Framework zum Erstellen von webbasierten Nutzeroberflächen zur Datenanalyse (sogenannten Dashboards), ist in Version 1.6 erschienen. Das Release unterstützt Bootstrap 4 und bietet ein neues Theming-Konzept, mit dem Nutzer offenbar einfacher als bisher das Erscheinungsbild ihrer Apps eigenen Vorstellungen anpassen können. Neben neuen interaktiven Elementen in der Bedienung ist das eigentliche Highlight wohl eine überarbeitete Cache-Funktionalität, mit der Anwender durch stufenweises Caching ihrer Arbeitsprozesse zu einer gleichmäßigeren Auslastung und verbesserten Performance gelangen sollen.
Die zugrundeliegenden Mechanismen der Datenverarbeitung und das Plotten einzelner Arbeitsschritte haben sich laut Ankündigung im RStudio-Blog nicht verändert. Das HTML5 / CSS / JavaScript-Framework basiert auf der im wissenschaftlichen Rechnen etablierten Programmiersprache R, und die Entwicklung von geräte- und plattformübergreifenden Web-Anwendungen findet in einem R-Backend statt, ohne dass HTML- oder JavaScript-Kenntnisse nötig wären. Programmierkenntnisse in R hingegen dürften von Vorteil sein, um zum Beispiel den neu hinzugekommenen Entwicklermodus nutzen zu können.
Theming mit Bootstrap 4
Shiny umfasst nun das Bibliothekspaket {bslib}
, das die Themes von Bootstrap 4 und Bootswatch enthält. Farben, Schriftarten und andere visuelle Elemente sollen sich damit einfacher als bisher verändern lassen. Neu hinzu tritt ein Theming-Widget namens bslib::bs_themer()
, das Entwickler jeder mit Shiny erstellten App hinzufügen können, um verschiedene Designvorlagen rasch als Vorschau zu sehen. Ebenfalls verfügbar ist rmarkdown::html_document()
.
Um die Bootstrap-Library in eigenen Shiny-Apps zu nutzen, mĂĽssen R-Entwickler den theme
-Argumenten fluidPage()
, navbarPage()
und bootstrapPage()
(zum Nutzen von Markdown) ein bslib::bs_theme()
bereitstellen. Innerhalb des bs_theme()
lassen sich dann die zu verwendende Bootstrap-Version (3 oder 4) sowie das gewĂĽnschte Bootswatch-Theme definieren, zum Beispiel so:
ui <- fluidPage(
theme = bslib::bs_theme(version = 4, bootswatch = "minty"),
...
)
Entwicklermodus mit Einstellungen fĂĽr Profis
FĂĽr Entwickler interessant ist der neu eingefĂĽhrte Developer Mode, der sich durch Aufruf von devmode()
aktivieren und durch den Befehl devmode(FALSE)
wieder deaktivieren lässt. Im aktivierten Entwicklermodus ändern sich eine Reihe von Standardeinstellungen der options()
zu Werten, die für Entwickler nützlich sein können. Den Modus sollten allerdings nur erfahrene R-Programmierer einsetzen, für die Veröffentlichung von Apps ist er nicht gedacht. Manuell getroffene Einstellungen überlagern weiterhin die Standardwerte im Developer Mode, sodass benutzerdefinierte Entscheidungen der Entwickler stets Priorität genießen.
Im Entwicklermodus lädt das Framework Apps neu, sobald sich eine zugrundeliegende R-Datei geändert hat (shiny.autoreload
ist TRUE
), fĂĽr ein reibungsloses Debugging minimiert es JavaScript-Dateien nicht (shiny.minified
ist FALSE
), bei Fehlern während der Programmausführung zeigt Shiny Entwicklern den vollständigen Stack-Verlauf an (shiny.fullstackstrace
ist TRUE
) und das Kompilieren von Sass zu CSS ist dann blockiert (die Defaulteinstellung sass.cache
ist FALSE
).
Zum Tragen kommt Letzteres, wann immer die Library {bslib}
in Kombination mit R-Markdown im Einsatz ist. Das Kompilieren von Sass zu CSS gilt als "kostspielig" in der Produktion, in der Entwicklung ist sein hauptsächlicher Nachteil jedoch ein anderer: Das Caching im laufenden Entwicklungsprozess kann mitunter zu irreführenden Falsch-Positivergebnissen führen, deshalb ist es zu vermeiden.
Caching mit neuem bindCache()-Feature
Um beim Erstellen von Apps nicht häufig aufgerufene Rechenvorgänge, die für zahlreiche Nutzer identisch wären, jedes Mal zu wiederholen, bietet die neue Version von Shiny eine Cache-Funktionalität an, die sich mit dem Befehl bindCache()
aufrufen lässt. In Shiny 1.6 erlauben die reactive
- und render
-Funktionen das Cachen ihrer Werte. In Dashboards, in denen viele Nutzer gleichzeitig auf dieselben Daten und Visualisierungen zugreifen, hilft das Caching, Bottlenecks in der Leistung zu reduzieren, da einmal aufgerufene Werte zwischengespeichert sind und die Rechenvorgänge nicht stets neu laufen müssen. Entwickler können das Feature nutzen, indem sie über die Ausdrücke reactive()
oder renderPlot()
(oder ĂĽber die Render-Funktion) dem bindCache()
ihren Cache-Schlüssel mitteilen. Im Falle eines aktiven Reactive-Ausdrucks wäre fetchData()
aufzurufen, womit sich Daten von der Web-API beziehen lassen:
weatherData <- reactive({
fetchData(input$city)
})
Um die Werte zu cachen, mĂĽssen Entwickler sie noch an bindCache()
durchreichen:
weatherData <- reactive({
fetchData(input$city)
}) %>%
bindCache(input$city)
Zur genauen Verwendung des Caching mit Shiny haben die Framework-Entwickler einen Leitfaden geschrieben.
Barrierefreiheit als langfristiges Ziel
Verbesserte Zugänglichkeit für Nutzer mit Einschränkungen war ebenfalls ein Ziel für das aktuelle Release, die bisherige Benutzeroberfläche (UI) galt nicht als barrierefrei. Die neue Version führt laut Entwicklerteam auf der Shiny-UI automatisch zu besserer Zugänglichkeit. Die Shiny-Entwickler betonen im Blogeintrag allerdings, dass das Framework zum jetzigen Zeitpunkt noch nicht durchgängig barrierefrei ist. Version 1.6 beschreiben sie als großen Sprung, allerdings befindet das Team sich noch in einem Lernprozess und kann Barrierefreiheit für alle daher nur als langfristiges Ziel anpeilen. Weitere Verbesserungen sind geplant.
Shinys UI inkludiert ab sofort die jeweils passenden ARIA-Eigenschaften für wesentliche Komponenten der Nutzeroberfläche wie selectizeInput()
, dateInput()
und icon()
. Mit den ARIA-Attributen können Nutzer mit eingeschränkter Motorik oder Sehfähigkeit die damit verknüpften Elemente über die Tastatursteuerung einfacher finden, auch Bildschirmlesegeräte (Screenreader) können Nutzer dadurch besser bei der Navigation unterstützen. Fokussierte Inhalte erscheinen nun mit gefetteter schwarzer Linie, wodurch Nutzer, die das Programm über die Tastatur bedienen, sich leichter im Code orientieren können. Ist hingegen die Computermaus aktiviert, entfällt als Standardeinstellung die Hervorhebung (mouse-outline-style
ist none
). Entwickler können optional den visuellen Fokus auch bei Bedienung mit der Maus aktivieren, wenn sie hier den Wert auf etwas anderes als none
setzen. Weitere Attribute lassen sich im Sprachbereich setzen, auch Alternativtext fĂĽr renderPlot()
lässt sich neuerdings ergänzen, wie folgendes Codebeispiel veranschaulicht:
ui <- fluidPage(
sidebarPanel(
sliderInput("obs", "Number of observations:", min = 1, max = 1000, value = 500)
),
mainPanel(plotOutput("plot"))
)
server <- function(input, output, session) {
vals <- reactive(rnorm(input$obs))
# A textual description of the histogram of values. Also checkout the BrailleR
# package to easily generate description(s) of common statistical objects
# https://github.com/ajrgodfrey/BrailleR
alt_text <- reactive({
bins <- hist(vals(), plot = FALSE)
bin_info <- glue::glue_data(bins, "{round(100*density, 1)}% falling around {mids}")
paste(
"A histogram of", input$obs, "random values with ",
paste(bin_info, collapse = "; ")
)
})
output$plot <- renderPlot({
hist(vals())
}, alt = alt_text)
}
shinyApp(ui, server)
Zum Installieren der neuen Version genĂĽgt es ĂĽbrigens, den Befehl install.packages("shiny")
auszufĂĽhren. Alle weitere Details und vertiefende Ressourcen lassen sich der Releasemeldung im RStudio-Blog entnehmen.
(sih)