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.

In Pocket speichern vorlesen Druckansicht

(Bild: Ustyna Shevchuk/Shutterstock.com)

Lesezeit: 6 Min.
Von
  • Silke Hahn
Inhaltsverzeichnis

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.

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"),
  ...
)

Blick ins R-Backend, wo sich bei Shiny 1.6 die Parameter für das Theming benutzerdefiniert anpassen lassen.

(Bild: RStudio)

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.fullstackstraceist 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.

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.

Vorher-Nachher-Ansicht: Das Theming der Dashboards und Apps lässt sich in Shiny 1.6 variabel anpassen.

(Bild: RStudio)

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)