Przed świętami pokazaliśmy interaktywną choinkę napędzaną statystykami popularności imion nadawanych dzieciom. Po świętach pokazaliśmy jak w pakiecie ggplot2 narysować choinkę.
Wczoraj pomiędzy Pałacem Kultury i Nauki a Dworcem Centralnym natknąłem się na choinkę, która wciąż świeci. Przyznacie, że choinka w lutym wygląda już dziwnie. Potraktujmy to jako znak, że najwyższy czas do końca rozebrać i naszą choinkę napisaną w shiny.
Co to jest shiny?
Shiny to pakiet pozwalający na prostą budowę interaktywnych aplikacji webowych w czystym R.
Czy warto go poznać? Niech za odpowiedź posłuży taki komentarz: prowadziłem w poprzednim semestrze zajęcia na MIM UW, prowadziłem na MINI PW, prowadzę czasami szkolenia. I w każdej grupie, za każdym razem, co bym nie pokazywał, najwięcej entuzjazmu budzą możliwości pakietu shiny. To niesamowite jak prosto można z użyciem tego pakietu zbudować całkiem przydatną aplikację, dashboard, narzędzie eksploracji.
Dzisiaj pokażę tutaj bardzo prostą aplikację. Inspiracje i przykłady tego, co można zrobić znaleźć można na tej stronie.
Wystarczy katalog, w którym będą dwa pliki: server.r
i ui.r
.
Interface
Plik ui.r
opisuje interface użytkownika. Nasza aplikacja ma tylko dwa elementy: pole tekstowe w które można wpisywać imię oraz miejsce na narysowanie choinki. Poniższy kod definiuje prostą stronę z jednym textInput()
(polem tekstowym), początkowo pustym za to o tytule 'Zaznacz imiona’. W aplikacji do wartości tego pola można się odwołać poprzez zmienną 'imie’. Definicja obszaru rysowania składa się z jego rozmiarów (720×720) i nazwy funkcji, która będzie odpowiedzialna za rysowanie choinki.
Logika
O ile plik ui.r
opisuje interface o tyle plik server.r
zawiera całą logikę. Pokażmy jego treść a później ją omówimy.
Co się dzieje w środku tego pliku?
Linie od 2 do 6 to wczytywanie niezbędnych bibliotek, głównie z funkcjami upiększającymi wykresy.
W linii 8 wczytujemy dane (można je tak jak i cały kod pobrać z tej strony) a następnie linie 10-21 to definicja funkcji rysującej choinkę (omówiona w tym wpisie).
Cała logika skrywa się w wywołaniu funkcji shinyServer()
. Jest nim funkcja tworząca uchwyty, takie jak output$choinka
. Wartością tego uchwytu jest funkcja, która generuje wykres, który umieszczony będzie w interface tam gdzie jest plotOutput("choinka")
.
Co się dzieje w tej funkcji? Generowany jest obrazek wektorowy SVG (gdyby wystarczył nam rastrowy png kodu byłoby mniej, ale obrazek by się tak ładnie nie skalował i nie miałby ostrych krawędzie). Obrazek to choinka z dodanymi dwoma warstwami geom_text()
(podświetlanie imion).
Zauważmy, że w kodzie uchwytu output$choinka
używamy zmiennej input$imie
, której wartością jest zawartość pola tekstowego. Za każdym razem, gdy zmienia się zawartość kontrolek w aplikacji shiny, serwer sprytnie sprawdza, które obiekty w aplikacji zależą od zmienionych kontrolek i aktualizuje treść tylko tych, które powinny się zmienić (propagacja zmian, tak jak w Excelu).
Ponieważ w naszym przykładzie input$imie
wykorzystywane jest w funkcji rysującej choinkę, to za każdym razem, gdy zmieniła się zawartość pola tekstowego choinka jest rysowana na nowo.
Działającą aplikację można zobaczyć na tej stronie.
Co dalej?
Jeżeli kogoś zainteresował pakiet shiny to polecam świetny tutorial http://shiny.rstudio.com/tutorial/.