Min første Shiny-app

Kort sagt er Shiny en R-pakke som gjør det enkelt å bygge grensesnitt for å interagere med og visualisere data i R. Istedenfor å forklare hva Shiny er med masse tekst, har jeg valgt å gå gjennom et par nøkkelementer med R-kode.

Hvordan fungerer R Shiny?

Til å begynne med er det nødvendig å ha installert Shiny-pakken

install.packages("shiny")

I R lastes (installerte) pakker inn med library funksjonen.

library("shiny")

En Shiny-app består av to hovedekomponenter: UI (“frontend”) og serveren (“backend”), gjerne samlet i ett R-skript ("app.R"):

OBS: R-skriptet med all kode for Shiny-appen finner du her (og lenger ned på siden)

UI

UI styrer brukergrensesnittet og layout i appen. Under er kode for å lage en Shiny-app med kun tittelen "Shiny-app!".

For å kunne kjøre Shiny-appen er det nødvendig å definere server-komponenten. Inntil videre lar vi den stå tom (se bildet under). UI (= UserInterface) og serveren samles sammen med funksjonen shinyApp. I Rstudio (et populær brukergrensesnitt for R) finnes det en egen knapp, “Run App”[1] for å kjøre en Shiny-app.

Med dette får vi endelig sett vår enkle Shiny-app:

Shiny-app med tittel "Shiny app!"

Typisk sett vil UI bestå av en sidebarPanel, hvor man gjerne har ulike valg og menyer og en mainPanel, som er hovedområdet hvor resultatene vises. Resultatene kan grovt sett vises i enten figurer eller i tabeller. I dette oppsettet legges både sidebarPanel og mainPanel inn under

Kode for å lage en hoved- og sidepanel

App med hoved- og sidepanel

En Shiny-app trenger strengt tatt ikke å begrenses til én side. En måte å dele en Shiny-app i flere “sider” er med faner:

Kode for å lage flere faner

Hovedpanel med flere faner

Det er mange andre innstillinger man kan ha i UI, men alene er det ikke veldig mye interessant man får gjort før man kopler Ui med serveren og hvordan den interagerer med UI.

Server

I serveren definerer man selve funksjonaliteten i appen ("backend"), altså dataene og/eller utregningen som faktisk vises i UI.

Kode i server som lager en histogram

Resultatet fra koden over er (et histogram) som sendes til UI. Oftest lagres slike objekter innad et "output”-objekt, med et egendefinert navn (f.eks. “histogram”). Denne “histogram”-figuren kan hentes i og vises i UI slikt:

Kode i UI som "henter" histogrammet fra serveren

Her er det slik at samme objekt i UI og serveren må henvises med samme navn (altså “histogram”)

Sluttresultatet:

Histogram i hovedområdet

Det finnes en rekke Shiny-funksjoner for ulike type resultater, bl.a. for tekst, tabeller, men også for resultater fra spesifikke R-pakker. Den virkelige styrken med en Shiny-app at UI også kan sende informasjon til serveren. Først kan vi spesifisere hva slags informasjon vi vil sende fra UI. Funksjonen sliderInput, f.eks. brukes til å velge et alternativ fra en liste, i dette tilfellet, med farger.

Hvordan å ta i bruk selectInput()

Formålet med denne er å velge hvordan histogrammet skal fargelegges. Slike “innstillinger” fra UI hentes i serveren med input$<navn til instillingen> (her, input$velg_farge). Siden jeg har valgt å ha fargene på norsk må disse i tillegg oversettes i gjeldende serverfunksjon i en rekke if-betingelser.

hvordan å hente input fra UI'en i serveren

Og sluttresultatet:

Histogram med fargevalg

I et siste eksempel kan vi legge til en sliderInput for å styre hvor mange datapunkter som skal plottes i histogrammet

Kode i UI:

Eksempelkode for sliderInput()

Kode i server:

Hvordan å hente input fra UI'en i serveren (del 2)

Visning i Shiny-app:

Slider i praksis med histogram

Vedlagt her er R-skriptet med alt som er gjennomgått over. Om ønskelig kan server- og UI-komponentene deles opp[2] i egne skript, f.eks. "server.R", "ui.R"  dersom kodebasen blir stor. I tillegg kan kode for øvrige prosesserer (f.eks. dataprosessering som skal skje “utenfor” appen) legges inn i egne skript (f.eks. “script1.R”, “script2.R”) som igjen kan hentes inn i Shiny-appen med source-funksjonen.

Hvorfor Shiny?

Dette var en rask gjennomgang av hvordan UI og serveren kan interagere med hverandre. Et mer realistisk kontekst er å operere med data i tabulær form, hvor innstllinger i UI kan brukes til å trekke ut et visst antall rader, kolonner, eller filtrere dataene basert på en eller annen verdi. Slike operasjoner med Shiny kan være særlig nyttig når man må håndtere store datasett.

Fordelen med R er at man kan benytte seg av innbygde funksjoner for å bearbeide data, samt en haug av pakker for dataanlyse, inkludert maskinlæring, men også datavisualisering (bl.a. ggplot2). Utseendet i UI kan finpusses med CSS og HTML, samt JavaScript for mer funksjonalitet. Shiny er et godt etablert produkt som har sine egne tilleggspakker, bl.a. shinydashboard (gjør det enklere å utvikle “dashboards”[3]) og shinyjs (gjør det enklere å ta i bruk JavaScript)

Vi i TASK-gruppen er involvert i utviklingen av flere Shiny-app’er. To av dem er satt i produksjon (i separate TSD-prosjekter) for forskningsprosjektene NORTRAS (se bildet under) og MinDag. NORTRAS-grensesnittet brukes til å holde oversikt over og visualisere data fra en rekke sammenslåtte og prosseserte nettskjemaer knyttet til (opplæring i) psykoterapi, både på individ- og gruppenivå. MinDag sSiny-appen har innstillinger for å velge hvilke aspekter man vil trekke ut fra ulike nettskjemaer og visualisere i linjediagrammer, som så blir lagt til i enkle HTML-rapporter[4] (for en gitt respondent)

NORTRAS shiny-app

Ta gjerne kontakt med oss i TASK for en prat om shiny-apper og i hvilken grad vi kan bidra med utvikling.

Nyttige kilder

[1] For de virkelige interesserte er tilsvarende R-kode: runApp(“navn_til_shiny_app.R”)

[2] Det var faktisk en forutsetning i tidlivere versjons av shiny å lagre UI og server komponentene i egne R-scripter

[3] Et dashboard gir et oversikt over dataene oftest i form av ulike aggregeringer.

[4] Se tidligere blogginnlegg om Rmarkdown her og her (et verktøy for å utforme rapporter i R)

Av Luigi Maglanoc
Publisert 3. juni 2022 09:52 - Sist endret 12. jan. 2023 10:28
sju mennesker

En blogg for deg som er interessert i IT-verktøy og datahåndtering, samt informasjon om, og erfaringer fra, forskningsprosjekter hvor bruk av IT inngår som en sentral del, enten det dreier seg om kvalitative eller kvantitative metoder/forskningsspørsmål.