Dostęp do baz danych przy wykorzystaniu interfejsu ROracle i biblioteki Shiny 1 Wprowadzenie W opisie zadań wykorzystano środowisko programistyczne rstudio (wersja 1.0.136). Celem ćwiczenia jest zapoznanie się z mechanizmem dostępu do bazy danych z poziomu języka R z wykorzystaniem interfejsu ROracle. Wykorzystamy również bibliotekę Shiny do zbudowania interaktywnej aplikacji, która będzie wyświetlała dane z bazy danych. Aplikacje Shiny działają zgodnie z modelem akcjareakcja (ang. reactive programming). Jest to model znany np. z arkuszy kalkulacyjnych. Zazwyczaj takie arkusze poza danymi zawierają również formuły określające, jak ma być wyznaczona wartość danej komórki w zależności od innych komórek. Jeżeli zmienimy wartość w jednej komórce (akcja) to automatycznie zmienią się wartości w komórkach znalezionych (reakcja). Podobnie wygląda reakcja w aplikacji zbudowanej z wykorzystaniem biblioteki Shiny. Na stronie html umieszczamy kontrolki wskazujące pewne wartości oraz wyniki działania funkcji na tych wartościach. Gdy zmienimy kontrolkę, to odświeżone zostaną wszystkie wyniki, które od danej kontrolki zależą. Takie inteligentne odświeżanie wartości, które mogą się zmienić, pozwala na budowę szybkich i jednocześnie złożonych aplikacji. Model akcja - reakcja wymaga oprogramowania sposobu, w jaki elementy wejściowe wpływają na wygląd/stan/wartość elementów wyjściowych. Jeżeli w trakcie pracy zmieniona zostanie wartość jakiegoś elementu wejściowego (kliknięty przycisk, wpisana wartość liczbowa, przesunięty suwak), to przeliczone zostaną odpowiednie elementy wyjściowe. 1.1 W sieci znajdziemy wiele ciekawych tutoriali oraz licznych przykładowych rozwiązań z użyciem tej biblioteki. Obszerne źródło na temat biblioteki znajdziemy pod adresem: http://shiny.rstudio.com, na uwagę zasługuje również: http://www.rstudio.com/wp-content/uploads/2016/01/shinycheatsheet.pdf 1.2 Architektura klient - serwer. Strona Serwera Strona Klienta Shiny Baza Danych Serwer aplikacji Przeglądarka
1. Struktura aplikacji Shiny. Aplikacja shiny posiada typową strukturę aplikacji internetowej. Użytkownik specyfikuje, który element UI (user interface), ma zostać wyświetlony, kod R np. odpowiedzialny za rysowanie wykresu, treść w postaci tekstowej czy w formie tabeli. Każda aplikacja składa się z dwóch części ui oraz części server a, które mogą być składowane w jednym bądź różnych plikach. Część ui jest odpowiedzialna za wyświetlane elementy interfejsu użytkownika, natomiast część server zawiera cały wykonywalny kod aplikacji. Generowanie strony, która zawiera elementy HTML, CSS oraz skrypty JavaScript odbywa się poprzez kod R zawarty w tych dwóch częściach. Dodatkowo, gdy element UI zostanie zmodyfikowany, cały odpowiadający mu kod jest wykonywany (np. wykres) i jest automatycznie uaktualniany. a. Przykładowy ui.r shinyui(fluidpage( titlepanel("tytul aplikacji"), sidebarlayout( sidebarpanel( "sidebar panel"), mainpanel("main panel")))) b. Przykładowy server.r shinyserver(function(input, output){ 2 Uruchomienie serwera aplikacji Korzystając z rstudio, mamy od razu serwer aplikacji, który będzie wykorzystywany przez naszą aplikację. Aplikację możemy uruchomić z poziomu rstudio poleceniem : runapp('nazwa_projektu/aplikacja.r ) Lub podając adres w przeglądarce np. http://127.0.0.1:5509 3 Utworzenie projektu w środowisku rstudio 3.1 Uruchom środowisko rstudio. 3.2 Utwórz nowy projekt wybierając z górnego menu File->New Project.
3.3 Wprowadź nazwę projektu np. ShinyApp. Wybierz opcję aplikacji w jednym pliku (Single File). Zapisz projekt w katalogu Dokumenty. 3.4 Zaczniemy od uruchomienia testowej aplikacji, która wyświetla interaktywny histogram z danymi na temat gejzerów. Uruchom aplikację poprzez naciśnięcie przycisku Run App. W efekcie uzyskujemy następujący wynik.
4 Nawiązanie połączenia z bazą danych i odczyt danych. Teraz zbudujemy aplikację, która będzie wyświetlała dane o pracownikach z bazy danych Oracle w postaci tabeli. Wykorzystamy do tego celu bibliotekę DBI, ROracle oraz Shiny. 4.1 Usuń kod przykładowej aplikacji. Na jego miejsce wpiszemy nowy. 4.2 Wczytaj zawartość bibliotek do aplikacji. library(dbi) library(roracle) library(shiny) 4.3 Nawiązujemy połączenie z bazą danych dblab01. drv = dbdriver( Oracle ) con = dbconnect( scott, tiger,"admlab2- main.cs.put.poznan.pl:1521/dblab01.cs.put.poznan.pl"; 4.4 Teraz zajmiemy się częścią odpowiedzialną za interfejs użytkownika. Nasza aplikacja, dla podanego identyfikatora zespołu, będzie wyświetlać jego pracowników. Do tego celu wykorzystamy element TextInput(), który będzie służył do wprowadzenia danych wejściowych. Dla podanego identyfikatora zespołu wyświetleni zostaną pracownicy, którzy w nim pracują. Element TableOutput(), będzie odpowiedzialny za wyświetlenie danych w postaci tabelarycznej. ui <- fluidpage( sidebarlayout( sidebarpanel( textinput("id","podaj identyfikator zespolu pracownikow:","10"), tableoutput("tbl") ), Inne przykładowe elementy wejściowe: actionbutton() checkboxinput() datainput() daterangeinput() FileInput() NumericInput() radiobuttons() selectinput() sliderinput() Pełna lista możliwych elementów wraz z opisem dostępna na stronie: https://shiny.rstudio.com/tutorial/lesson3/ 4.5 Część serwera jest odpowiedzialna za wykonanie odpowiedniego zapytania do bazy danych jak i dostarczenia przetworzonych wyników.
server <- function(input, output) { output$tbl <- rendertable({ sql <- SELECT * FROM PRACOWNICY WHERE ID_ZESP =?id query <- sqlinterpolate(con,sql,id=input$id) dbgetquery(con,query) } 4.6 Część wspólna shinyapp(ui = ui, server = server) 4.7 Uruchom aplikację. Sprawdź czy działa poprawnie. 4.8 Teraz element tekstowy interfejsu użytkownika zamienimy na interaktywny przesuwak. Zastąp textinput na sliderinput, z następującymi parametrami: sliderinput("id","podaj identyfikator zespolu pracownikow: ",10 100, 10, 10,ticks=TRUE) 4.9 Do naszej aplikacji dołączymy jeszcze jeden element wyjściowy, wyświetlimy pracowników w postaci barplotu. Do ui dodajemy element odpowiedzialny za wyświetlenie takiej informacji. plotoutput( popplot ) 4.10 Do częsci server dodamy kod, który po wykonaniu dostarczy dane do narysowania wykresu. output$popplot <- renderplot({ query <- paste0( SELECT * FROM PRACOWNICY where ID_ZESP = ), As.integer(input$ID)[1]) df <- dbgetquery(con,query) pop <- df$placa_pod names(pop) <- df$nazwisko barplot(pop) Zadanie 1 Połączenie z bazą danych i wyświetlenie wyników Przygotuj aplikacje, która nawiąże połączenie z bazą danych, wyświetli informacje o pracownikach wraz z nazwą zespołu w którym pracują.