<table width = 900 border = 0><tr><td>
# <b>NMSA230 - 	Úvod do programování v R</b>
### <b>Zimný semester 2023/2024 | Cvičenie 6 | Čt 11/01/24 </b>

&#8226; <a href = "cvicenie6_2324.Rmd"><b>zdrojový Rmd súbor</b></a>

**************
**************


Program R (dostupný pod GNU GPL licenciou) je k dispozícii k stiahnutiu (free of charge) na adrese 

<a href = "https://www.r-project.org">https://www.r-project.org</a>

K dispozícii sú distribúcie s priamou podporou pre OS Windows, Linux aj Macintosh. 

Základnú  inštaláciu programu R je možne jednoducho rozšíriť pomocou dodatočných knižníc (balíčkov), ktoré 
sú k dispozícii na rôznych online repozitároch (zoznam hlavných repozitárov je na adrese <a href = "https://cran.r-project.org/mirrors.html">https://cran.r-project.org/mirrors.html</a>). Jednotlivé R knižnice sú tvorené samotnými užívateľmi softwaru R a ich správne 
fungovanie nie je garantované - je preto namieste určitá opatrnosť a hlavne aktívne premýšľanie pri ich používaní.

Pre užívateľov programu R sú k dispozícii aj rôzne grafické rozhrania, ktoré je možne dodatočne nainštalovať a umožňujú (v určitých smeroch)
jednoduchšiu a prehľadnejšiu prácu. Najznámejší a pravdepodobne aj jeden z najlepších R interfacov je <a href = "https://www.rstudio.com">RStudio</a>.<br><br>

<b>Užitočné materiály pre prácu so štatistickým programom <i>R</i></b><br>
		
<ul>
<li>Bína, V., Komárek, A. a Komárková, L.: <i>Jak na jazyk R.</i>  (<a href = "Rmanual2.pdf">PDF súbor</a>)</li>
<li>Komárek, A.: <i>Základy práce s R.</i>  (<a href = "Rmanual1.pdf">PDF súbor</a>)</li>
<li>Kulich, M.: <i>Stručný úvod do R.</i> (<a href = "uvodr.pdf" >PDF súbor</a>)</li>
<li>Scott, T.: <i>An Introduction to R</i> (<a href = "RLectureTScott.pdf" >PDF súbor</a>)</li>
<li>De Vries, A. a Meys, J.: <i>R for Dummies.</i> (ISBN-13: 978-1119055808) </li>		
</ul>

<br>

Cieľom posledného semináru NMSA 230 tomto semestri je stručná ukážka fungovania R knižnice <b>Shiny</b>, 
ktorá umožňuje interaktívne využitie programu R prostredníctvom internetového prístupu a webového prehliadača. <br><br>

## <b><font color = "#880000">VI. Knižnica Shiny </font></b>


Shiny je  (open source) knižnica pre štatistický program R (inštalácia pomocou štandardného príkazu `install.packages("shiny")`), 
ktorá umožňuje vytvárať hyperaktívne webové aplikácie, pomocou ktorých dokáže koncový úžívateľ jednoducho meniť nastavenia a kontrolovať 
priebeh výpočtu/analýzy nejakého konkrétneho procesu (napr. štatistickej analýzy datového súboru). V tomto smere má svoje zjavné výhody aj nevýhody.<br><br>

Knižnica `shiny` umožňuje jednoducho premeňiť R-kový zdrojový kód na interaktívnu webovú aplikáciu. Vyžaduje k tomu 
ale tzv. shiny server, ktorý beží na hosťovskom počítači spolu s programom R a umožňuje tak webovej aplikácii na klientskom počítači (v určitom zmysle) plnohodnotne fungovať -- t.j.,  vyhodnocovať R-kové príkazy v závislosti na klientských modifikáciach, ktoré uskutočnuje priamo vo svojom internetovom prehliadači.<br><br>
Inšpirácia a niekoľko príkladov vytvorených pomocou knižnice `shiny`: <a href = "http://shiny.rstudio.com/gallery/">http://shiny.rstudio.com/gallery/</a><br><br>

Pre účely tohto cvičenia (a pre zjavnú jednoduchosť) nebude potrebné inštalovať `shiny` server na hosťovskom počítači. Ako "hosťovský počítač" bude slúžiť priamo 
počítač/notebook na ktorom pracujete. Následujäce príklady budu využívať len lokálny pristup k programu R a  "hosťovský shiny server" bude imitovaný  priamo počítačom/notebookom, 
ktorý ma každý k dispozícii a na ktorom pracuje.<br><br>


### <b><font color = "#880000">1. Spustenie `Shiny` aplikácie</font></b>

K vytvoreniu funkčnej `shiny` aplikácie je potrebných niekoľko krokov: 

<ul>
<li>nainštalovať a načítať knižnicu `shiny`:

```{r, warning=F}
library("shiny")
```
</li>

<li>vytvoriť (HTML) stránku pomocou R-kového príkazu `fluidPage()`. Táto web (html) stránka bude následne pre aplikáciu slúžiť ako priestor pre zadávanie vstupných hodnôt 
pre program R  a zároveň bude poskytovať potrebné zdrojové informácie pre plnohodnotný výpočet -- resp. štatistickúp analýzu v R.  
Pomocou tejto stránky užívateľ kontroluje aplikáciu a modifikuje výpočty/analýzu;</li>

<li>naprogramovať príslušný R-kový kód, ktorý beží na  serveri `shiny` a ktorý pracuje so vstupnými informáciami poskytnutými webovou stránkou vytvorenou pomocou `fluidPage()` a po spracovaní 
a vyhodnotení R-kového zdrojového kódu odošle príslušný výstup späť na stránku. Požadovaný výstup sa uživateľovi zobrazí priamo na webovej stránke;</li>

<li>spustit samotnú `shiny` aplikáciu pomocou príkazu `shinyApp()`;</li>
</ul>

Najjednoduchší príklad funkčnej `shiny` aplikácie (ktorá ale v zásade nič nerobí), je vytvorená pomocou nasledujúcej časti R-kového kódu: 

```{r, eval = F}
library("shiny")

ui <- fluidPage("Hello Word"
   ### su za zadavaju vstupne informacie (inputs) a zobrazuju sa vystupy (outputs)
)

server <- function(input, output){
  ### R-kovy zdrojovy kod, ktory vyuziva list input (vstupne informacie) a vytvara z toho list vystupov (output)
}

### spustenie samotnej aplikacie (otvori webovy prehliadac s pozadovanou strankov vytvorenou vo fluidPage())
shinyApp(ui = ui, server = server) 
```

Obe vyššie vytvorené časti -- t.j., webová (html) stránka `ui`, aj shiny server `server` lze následne doplniť o dodatočné informácie -- vhodne štrukturovaný HTML kód, preddefinované moduly na zadávanie jednotlivých príkazov, alebo konkrétne data
pre program R, na základe ktorých sa pripraví výstup -- t.j.,  moduly na vizualizáciu výsledkov (tabuľky, obrázky, grafy a pod.).
<br><br>

#### <font color = "#880000">Doležité</font>
<hr size="3" width="100%" noshade style="color:#440000" align="left" />
Pri spustení R-kového kódu uvedeného vyššie, dôjde k otvoreniu webového prehliadača, v ktorom sa otvorí prázdna stránka 
s uvítaním "Hello World". Príkazový riadok v R-ku (konzola v RStudio) zostáva aktívny a nie je možné zadávať prostredníctvom 
konzoly dalšie príkazy. Program R očakáva, že príkazy bude dostávať priamo prostredníctvom otvoreného a aktivného webového prehliadača. 
Keďže nateraz nemáme v prehliadači nič konrétne vytvorené (príkaz `fluidPage()` je prázdny), musíme R-ko ukončiť manuálne -- t.j.,  buď kliknutím na tlačítko 
<font color = "red"> STOP</font>, alebo stlačením kombinácie kláves CTRL + C (prípadne zatvorením otvoreného webového prehliadača). 
<hr size="3" width="100%" noshade style="color:#440000" align="left" /  >
<br><br>


### <b><font color = "#880000">2. Jednoduché (štatistické) aplikácie pomocou knižnice  `shiny`</font></b>

Všetky hodnoty, ktoré potrebuje program R  ako vstupné hodnoty pre správne fungovanie (resp. štatistickú analýzu), sú automaticky uložené 
v liste (R object `list()`) s názvom `input` a na jednotlivé zložky listu je možné sa priamo odkazovať pomocou ID nálepky použitej pri vstupe. <br><br>

Analogicky aj všetky výstupy, ktoré `shiny` server pripraví pre následné zobrazenie prostredníctvom klientskej webovej stránky, 
sa ukladajú do listu (R object) s názvom `output` a na jednotlivé zložky 
sa opať môžeme priamo odkazovať pomocou príslušných ID nálepiek. <br><br>

Nasledujúci príklad umožnuje vykresliť histogram pre náhodný výber z normálneho rozdelenia $N(\mu, \sigma^2)$ o rozsahu $n \in \mathbb{N}$, 
avšak všetky tri parametre ($\mu \in \mathbb{R}$, $\sigma^2 > 0$, aj $n \in \mathbb{N}$) môže  užívateľ nastaviť samostatne prostredníctvom aktívneho webového prehliadača
vytvoreného pomocou `shiny`. <br><br>

Histogram a odhad hustoty sa interaktvívne vykreslí priamo v prehliadači (ako html stránka), hneď po zadaní vstupných hodnôt. 

```{r, eval = F}
library("shiny")

ui <- fluidPage(
  
  title = "Simple Example: Simulating data from normal distribution",
  
  sidebarPanel(
    sliderInput(inputId = "mean", label = "Choose Mean Value", min = -100, max = 100, value = 0),
    sliderInput(inputId = "var", label = "Choose Variance Value", min = 0, max = 10, value = 1),
    numericInput("number", label = "Number of Observations", value = 10),
    numericInput("breaks", label = "Number of Breaks", value = 10)
  ),
  
  mainPanel(
    plotOutput(outputId = "density")
  )
)

server <- function(input, output){
  output$density <- renderPlot({sample <- rnorm(input$number, input$mean, sqrt(input$var))
                                hist(sample, breaks = input$breaks, col = "blue", freq = F)
                                lines(density(sample), col = "red", lwd = 2)
                                })
}

shinyApp(ui = ui, server = server)
```


<br><br>

Ak ste príkazy zadali správne, vo webovom prehliadači by ste mali vidieť niečo podobné: <br>

<center>
<img src = "shiny.png" width = "900">
</center>

Pomocou nástrojov na zadávanie vstupných hodnôt (panel na ľavej strane) je možné modifikovať nastavenie generátoru náhodných čísel.
Následne sa v programe R vygeneruje nový/iný náhodný výber a príslušne sa prekresli histogram a odhad hustoty. <br><br>

Príkazový riadok v RStudio zostáva naďalej aktívny a nie je možné zadavať príkazy jinak, než pomocou otvoreného webového prehliadača -- opäť totiž program R  očakáva vstupné hodnoty, 
ktoré budú zadávané prostredníctvom nástrojov na webovej stránke. V prípade, že chceme R sekciu ukončiť, je nutné stlačiť tlačítko 
<font color = "red">STOP</font> alebo kombináciu kláves CTRL + C (prípadne zatvoriť okno webového prehliadača).
<br><br><br>


#### <font color = "#880000">Doležité</font>
<hr size="3" width="100%" noshade style="color:#440000" align="left" />
Všimnite si, akým sposobom funguje zadávanie vstupných hodnôt a akým spôsobom sú tieto hodnoty následne predané do programu R na sever `shiny` 
<ul>
<li>V knižnici `shiny` je niekoľko rôzných nástrojov (tzv. widgets) na zadávanie vstupných hodnôt - viď napr. <a href = "https://shiny.rstudio.com/tutorial/written-tutorial/lesson3/">https://shiny.rstudio.com/tutorial/written-tutorial/lesson3/</a>;</li>
<li>Každý príkaz, ktorý umožnuje zadávať vstupné hodnoty, musí mať priradené jednoznačné ID - pozri prvý argument v príkazoch vyššie. S týmto 
ID je potom vstupná hodnota predaná v liste `input` do R-ka: napr. vstupná hodnota pre voľbu strednej hodnoty je uložena v `input$mean`;</li>
<li>Fiktívny server - v našom prípade užívateľský počítač - využíva hodnoty uložené v liste `input` a v sérii R-kových príkazov 
pripraví príslušný výstup/výstupy, ktoré analogicky uloži do listu `output`;</li>
<li>V druhej časti príkazu `fluidPage()` umiestňujeme na webovú stránku pripravené výstupy, ktoré predal server po spracovaní programom R;</li>
<li>Analogicky ako v prípade zadávania vstupných hodnôt, aj pre vykresľovanie výstupov je v knižnici `shiny` k dispozícii niekoľko užitočných nástrojov - viď napr. <a href = "https://shiny.rstudio.com/tutorial/written-tutorial/lesson4/">https://shiny.rstudio.com/tutorial/written-tutorial/lesson4/</a>;</li>
</ul>
<hr size="3" width="100%" noshade style="color:#440000" align="left" /  >
<br><br>

#### <font color = "#880000">Samostatne</font>
<hr size="3" width="100%" noshade style="color:#440000" align="left" />
<ul>
<li>Využijte ďalšie možnosti, ktoré ponúka knižnica `shiny` a pokuste sa vytvorit interaktívnu aplikáciu, pomocou ktorej budete 
analyzovať nejaky datový súbor, ktorý je k dispozícii v programe R, avšak analýza bude závisieť na uživateľských nastaveniach (napr. výber 
premenných, voľba podsúboru dat, voľba hladiny spoľahlivosti a pod.).</li>

<li>Pokuste sa využiť rôzne možnosti zadávania vstupných informácii a tiež rôzne možnosti prezentovania výstupu. </li>
<li>Využijte rôzne varianty k peknému a účelnému usporiadaniu nástrojov na zadávanie vstupných informacii a panelov na 
vykresľovanie spočítaných výstupov.</li>
<li>Komplexnejšia ukážka s využitim viacerých panelov pre rôzne varianty výstupov je napr. nižšie:

```{r, eval = F}
library("shiny")

ui <- fluidPage(
  
  title = "Simple Example",
  
  sidebarPanel(
    sliderInput(inputId = "mean", label = "Choose Mean Value", min = -100, max = 100, value = 0),
    sliderInput(inputId = "var", label = "Choose Variance Value", min = 0, max = 10, value = 1),
    numericInput("number", label = "Number of Observations", value = 10),
    numericInput("breaks", label = "Number of Breaks", value = 10)
  ),
  
  mainPanel(
    tabsetPanel(
      tabPanel("Plot",  plotOutput(outputId = "density")), 
      tabPanel("Summary", verbatimTextOutput("summary")),
      tabPanel("Regression", plotOutput(outputId = "regression")),
      tabPanel("Regression Summary", verbatimTextOutput("regsum"))
    )
  )
)

server <- function(input, output){
  
  output$density <- renderPlot({set.seed(1234)
                                data <- data.frame(1:input$number, rnorm(input$number, input$mean, sqrt(input$var)))
                                hist(data[,2], breaks = input$breaks, col = "blue", freq = F)
                                lines(density(data[,2]), col = "red", lwd = 2)
                                })
  
  output$summary <- renderPrint({set.seed(1234)
                                 data <- data.frame(1:input$number, rnorm(input$number, input$mean, sqrt(input$var)))
                                 summary(data[,2])})
  
  output$regression <- renderPlot({set.seed(1234)
                                   data <- data.frame(1:input$number, rnorm(input$number, input$mean, sqrt(input$var)))
                                   plot(data[,2] ~ data[,1])
                                   model <- lm(data[,2] ~ data[,1], data = data, xlab = "Observation Number", ylab = "Observation Value")
                                   abline(model$coeff[1], model$coeff[2], col = "red", lwd = 2)})
  
  output$regsum <- renderPrint({set.seed(1234)
                                data <- data.frame(1:input$number, rnorm(input$number, input$mean, sqrt(input$var)))
                                plot(data[,2] ~ data[,1])
                                model <- lm(data[,2] ~ data[,1], data = data, xlab = "Observation Number", ylab = "Observation Value")
                                summary(model)})
}

shinyApp(ui = ui, server = server)

```
</li>

<li>Vyskúšajte uvedený skript  a pokúste sa ho podľa vlastných nápadov vhodne modifikovať. Vygenerovaná webová stránka by 
mala vyzerať nejak takto:

<center>
<img src = "shiny2.png" width = "900">
</center>
</li>
</ul>
<hr size="3" width="100%" noshade style="color:#440000" align="left" /  >
<br><br>



### <b><font color = "#880000">3. Rôzne (novšie) alternatívy pre `shiny`</font></b>

Webové stránky vytvorené pomocou R knižnice `shiny` je možné priamo rozšíriť napr. o CSS štýly, 
ale JavaScrip kódy. Samozrejme exustujú aj alternatívne možnosti, najznámejšie sú asi
<ul>
<li><a href = "https://streamlit.io/">StreamLit</a></li>
<li><a href = "https://plotly.com/dash/">Dash Enterprise</a></li>
<li><a href = "https://github.com/voila-dashboards/voila">Voilà   </a></li>
<li><a href = "https://panel.holoviz.org/">Panel   </a></li>
</ul>

prípadne niektoré ďalšie, uvedené napr. na stránke <a href = "https://stackshare.io/shiny/alternatives">https://stackshare.io/shiny/alternatives</a><br><br>

<br><br>


**************
**************

## <font color = "#880000"><b>Požiadavky na zápočet</b></font>

 
<ul>
<li>Nutnou a zároveň postačujúcou podmienkou na získanie zápočtu (ak má študent/študentka predmet riadne zapísaný v aktuálnom školskom roku v systéme SIS) je vypracovanie 
parciálných úloh zadaných v priebehu semestra a včasné odovzdanie celkového PDF reportu vrámci stanoveného deadlinu.</li>

<li>Parciálne úlohy postupne zadávané na seminároch 1 až 4 zahrňovali vygenerovanie vlastného datového súboru, vytvorenie niektorých dôležitých popisných charakteristík s vhodným grafickým doplnením a celkové spracovanie 
pomocou R knižnice 'Sweave'. </li>

<li>Finálný súbor PDF  je potrebné zaslať emailom<br><br>

<center>
<font color = "red">na adresu maciak[AT]karlin.mff.cuni.cz najneskôr 
do konca skúškového obdobia, t.j. do 18.02.2024.</font>.
</center>
</li>
</ul>


<br><br>
</td></tr></table>
<br><br><br><br><br>