<table width = 900 border = 0><tr><td>
# <b>NMSA230 - 	Úvod do programování v R</b>
### Zimný semester 2020/2021 | Cvičenie 5 | St 02/12/20 (10.týždeň) | Distančná forma

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

## <b><font color = "#880000">V. Knižnice Knitr & Shiny </font></b>

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 softwarom <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 piatého semináru NMSA 230 je práca s datami, jednoduché simulácie a R knižnice `Knitr` (na prípravu HTML Markdownow, ako je napríklad táto stránka)
a  `Shiny` (na prípravu interaktívnych webových aplikácii).



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

### <font color = "#880000"><b>1. Knižnica 'Knitr'</b></font>

Knitr (GNU General Public License) je knižnica pre štatistický program R, ktorá umožňuje integráciu R-kového zdrojového kódu  
do HTML jazyka (v určitom zmysle analogickým spôsobom, ako knižnica `Sweave` umožňovala integráciu programu R a LaTeXu). 
Výslednym produktom knižnice `Knitr` je súbor html, ktorý je možné prezerať pomocou internetového prehliadača. Takto bola vytvorená napríklad 
aj táto stránka. <br>

Inštalácia a inicializácia knižnice pomocou štandardných príkazov 

```{r, eval = F}
install.packages("knitr")
library("knitr")
```

U niektorých grafických interface (napr. RStudio) môže byť už tento balíček nainštalovaný štandardne a volanie príslušnej funkcie 
je redukované iba na stlačenie príslušného tlačítka <i>Knit</i> v hlavnom menu. Vstupným suborom je podkladový súbor typu <i>Rmd</i>, ktorý obsahuje 
jednak zdrojový kód pre html stránku a tiež vhodne označené príkazy pre program R. Pri kompilácii podkladového súboru sú R-kové príkazy 
najprv vyhodnotené a výsledky sú dopĺnené do zdrojového html kódu. <br><br>

Niekoľko príkladov využitia knižnice 'Knitr' v programe R v podobe podkladových  <i>Rmd</i>  súborov z predchádzajúcich seminárov (niektoré z nich ale môžu pri kompilácii vyžadovať súbory, 
ktoré nejsou automatickou súčasťou podkladového  <i>Rmd</i>  súboru - v takom prípade napr. postači psíslušnú časť zdrojového kódu zmazať). Podkladové  <i>Rmd</i>  súbory je možné otvoriť v programe RStudio (UTF8 kódovanie)
a následne skompilovať  stlačením tlačítka "Knit" na hlavnej lište.<br>

<ul>
<li>podkladový súbor z prvého cvičenia predmetu NMSA230: <a href = "cvicenie1_2021.Rmd">Rmd súbor</a> (kódovanie UTF8);</li>

<li>podkladový súbor z druhého cvičenia predmetu NMSA230: <a href = "cvicenie2_2021.Rmd">Rmd súbor</a> (kódovanie UTF8);</li>

<li>podkladový súbor z tretieho cvičenia predmetu NMSA230: <a href = "cvicenie3_2021.Rmd">Rmd súbor</a> (kódovanie UTF8);</li>

<li>podkladový súbor zo štvrtého cvičenia predmetu NMSA230: <a href = "cvicenie4_2021.Rmd">Rmd súbor</a> (kódovanie UTF8);</li>

<li>podkladový súbor z piateho cvičenia predmetu NMSA230: <a href = "cvicenie5_2021.Rmd">Rmd súbor</a> (kódovanie UTF8);</li>
</ul><br>




#### <font color = "#880000">Samostatne</font>
<hr size="3" width="100%" noshade style="color:#440000" align="left" />
<ul>
<li>Na rozdiel od knižnice `Sweave` je zdrojový kód programu R v pre knižnicu `Knitr` oddelený pomocou párových znakov<br>

<img src = "kod.jpg" width = 900>

pričom v úvode je opäť dovolené používať dodatočné premenné určené (ako napr. `eval = F`, čo znamená, že príslušná časť R-kového zdrojového kódu 
bude pri kompilácii ignorovaná).
</li>

<li>Využijte podkladové Rmd súbory uvedené vyššie, otvorte ich v programe RStudio a príslušný <i>Rmd</i> súbor zkompilujte 
(pomocou tlačítka `Knit HTML` v menu).</li>
<li> Podkladový <i>Rmd</i> súbor doplňte o vlastnú časť R-kového zdrojového kódu. Pridajte 
minimálne jeden obrázok a finálny <i>Rmd</i> súbor opäť skompilujte a vytvorte výsledný HTML súbor. </li>
</ul>
<hr size="3" width="100%" noshade style="color:#440000" align="left" /  >
<br><br>


### <font color = "#880000"><b>2. Štatistická analýza a jednoduché štatistické simulácie</b></font>

Nasledujúci príkaz načíta reálne data, ktoré zaznamenávajú rôzne informácie o tehotných pacientkách a následných pôrodoch na gynekologickom oddelení v 
Liptovskom Mikuláši. Data sú v pôvodnom tvare/formáte, ako ich poskytli samotni lekári. 

```{r}
data <- read.csv("http://www.karlin.mff.cuni.cz/~maciak/NMSA230/gynData.csv", header = T, dec = ".", sep = "") 
```

Data obsahujú niekoľko rôznych premenných z ktorých väčšina je momentálne pre naše účely nepodstatná. V prevažnej väčšine sa ale jedná o rôzne lekárske kritéria, 
výsledky konkrétnych tehotenských testov, čí prípadné výskyty rôznych komplikácii (informácia v tvare pozitívny výsledok vs. negatívný výsledok) a tiež hodnoty testov na tehotensku cukrovku (veličiny `glik1` až `glik4`).
Doplnené sú niektoré základné popisné charakteristiky pacientky (vek, výška, hmotnosť, BMI), popisné charakteristiky narodeného dieťaťa (pohlavie, obvod hlavy a hrudníka, dĺžka, váha, systolický a diastolický krvný tlak a ďalšie).

```{r}
names(data)
```

Podstatné ale je prehliadnúť si data a uvedomiť si niektoré chyby: 

```{r}
table(data$cisarskyREX)
table(data$cisarskyVEX)
table(data$hospit)
```

Tieto chyby opravíme pomerne jednoducho, nakoľko sa jedná o jednoduché korekcie. V zložitejších prípadoch je ale 
vhodné pamätať na možnosti, ktoré v programe R máme vďaka jeho schopnosti pracovať s tzv. regularnými výrazmi (napr. príkaz `grep()`). 


```{r}
data$cisarskyREX[which(data$cisarskyREX == "pn")] <- "poz"
data$cisarskyREX <- factor(data$cisarskyREX, levels = c("neg", "poz"))

data$cisarskyVEX[which(data$cisarskyVEX == "")] <- "neg"
data$cisarskyVEX <- factor(data$cisarskyVEX, levels = c("neg", "poz"))

data$hospit[which(data$hospit == "nn")] <- "neg"
data$hospit <- factor(data$hospit, levels = c("neg", "poz"))
```

Z určitých expertných dôvodov je pre lekárov doležite rozlíšiť staré a nové kritéria (prvé dva stĺpce v datach). Zavedieme 
preto novú premennú, ktorá bude súhrnne popisovať výsledky oboch kritérii:

```{r}
data$kriteria <- rep("neg", dim(data)[1])
data$kriteria[data$nove == "poz" & data$povodne == "neg"] <- "posNove"
data$kriteria[data$nove == "neg" & data$povodne == "poz"] <- "posPovd"
data$kriteria[data$nove == "poz" & data$povodne == "poz"] <- "posBoth"
data$kriteria <- as.factor(data$kriteria)

table(data$kriteria, data$nove)
table(data$kriteria, data$povodne)
```

<br><br>

#### <font color = "#880000">Samostatne</font>
<hr size="3" width="100%" noshade style="color:#440000" align="left" />
<ul>
<li>Podívajte sa na data a skuste spočítať niektoré základné popisné charakteristiky. Tieto charakteristiky doplňte o vhodne zvolené 
obrázky, ktoré budú popisné charakteristiky vizuálne reprezentovať.</li>
<li>Pokúste sa pomocou popisných charakteristík povedať niečo o starých a nových kritériach vzhledem na výskyt rôznych komplikácii 
(rozlišujete pacientky v závislosti na výsledkoch starých a nových kriterii, resp. na novo-zavedenej premenne `kriteria`). </li>
<li>Pomocou popisných charakteristík novorodenca sa pokúste ponúknuť odpoveď na otázku, či je rozdiel medzi novonarodeným chlapcom a novonarodenou holkou.</li>
</ul>
<hr size="3" width="100%" noshade style="color:#440000" align="left" /  >
<br><br>


V nasledujúcej časti sa zameriame pouze na hmotnosť novonarodených deti (premenná `hmotnost`). Histogram so zaznamenanými hodnotami 
vyzera takto (pre lepšiu vizuálizáciu je súčasťou histogramu aj neparametrický odhad hustoty a hustota normálneho rozdelenia 
so strednou hodnotou rovnou výberovému priemeru a rozptylom rovným výberovému rozptylu): 

```{r, fig.width = 10}
hist(data$hmotnost, xlab= "Hmotnosť novorodenca", freq = F, ylab= "Relatívny výskyt", main = "", col = "lightblue", breaks = 20)
lines(density(data$hmotnost), col = "red", lwd = 2)
lines(dnorm(seq(1500, 5000, length = 10000), mean(data$hmotnost), sd(data$hmotnost)) ~ seq(1500, 5000, length = 10000), col = "blue", lty = 2)
```

<ul>
<li>Červenou krivkou je zobrazený neparametrický odhad hustoty, ktorý svojim tvarom možno pripomína hustotu normálneho rozdelenia s nejakým 
vhodným parametrom strednej hodnoty a rozptylu.</li>

<li>Modrou krivkou je zobrazená teoretická hustota normálneho rozdelenia, kde jako stredná hodnota a rozptyl sú použite empirické odhady získane z dat.
```{r, fig.width = 10}
mean(data$hmotnost)
var(data$hmotnost)
```
</li>
</ul><br><br>

Formálne by sme mohli napríklad otestovať, čí namerané hodnoty výšky novorodencov pochádzajú z normálneho rozdelenia (nulová hypotéza), alebo pochádzajú z nejakého iného rozdelenia (alternatívna hypotéza). 
Na testovanie takto definovanej nulovej hypotézy máme v teórii pravdepodobnosti a v štatistike
niekoľko rôznych testov, ktoré ale nie sú ekvivalentné. 

<ul>
<li><b>Kolmogorov-Smirnovov test</b> - v programe R implementovány v príkaze `ks.test()`;</li>
```{r, warning = F, message = F}
ks.test(data$hmotnost,"pnorm",mean=mean(data$hmotnost),sd=sd(data$hmotnost),exact=FALSE)
```

<li><b>Shapiro-Wilkův test</b> - v programe R implementovány v príkaze `shapiro.test()`;</li>
```{r, warning = F, message = F}
shapiro.test(data$hmotnost)
```

<li><b>Jarque-Bera test</b> - v programe R implementovány v knižnici `tseries` v príkaze `jarque.bera.test()`;</li>
```{r, warning = F, message = F}
library(tseries)
jarque.bera.test(data$hmotnost)
```
</ul>


Rozhodnutie o nulovej a alternatívnej hypotéze je rôzne na základe rôznych testov. Ako si vybrať ten správny test? 
K odpovedi nám pomôže mala simulačná štúdia, ktorá sa bude zameriavať na sílu jednotlivých testov. 

```{r, fig.width = 10}
N <- c(10, 50, 100, 200, 500, 1000, 2000, 5000)

power <- NULL
set.seed(1234)
for (n in N){
  p1 <- p2 <- p3 <- NULL
for (i in 1:100){
  x <- rchisq(n, df = 50)
  p1 <- c(p1, as.numeric(ks.test(x,"pnorm",mean=mean(x),sd=sd(x),exact=FALSE)$p.value < 0.05))
  p2 <- c(p2, as.numeric(shapiro.test(x)$p.value < 0.05))
  p3 <- c(p3, as.numeric(jarque.bera.test(x)$p.value < 0.05))
}
power <- rbind(power, c(n, mean(p1), mean(p2), mean(p3)))
}

plot(power[,4] ~ log10(power[,1]), col = "red", type = "l", pch = 21, bg = "red", xlab = "Logarimus rozsahu náhodného výberu", ylab = "Empirická síla testu", ylim = c(0,1))
points(power[,4] ~ log10(power[,1]), pch = 21, bg = "red")
points(power[,3] ~ log10(power[,1]), pch = 21, bg = "blue")
points(power[,2] ~ log10(power[,1]), pch = 21, bg = "green")

lines(power[,3] ~ log10(power[,1]), col = "blue")
lines(power[,2] ~ log10(power[,1]), col = "green")
abline(1,0, col = "black", lty = 3)

legend(1, 1, legend = c("Shapiro-Wilk test", "Jarque-Beta test", "Kolmogorov-Smirnov test"), col = c("blue", "red", "green"), lty= rep(1,3))
```

Z tohto pohľadu je najsilnejším testom práve Shapiro-Wilkov test. Je potrebné ale pamätať na to, že testy boli spočítane pri konkrétnej alternatíve - skutočné rozdelenie bolo $\chi^2$ rozdelenie s 50 stupňami voľnosti. Jak sa ale porovnanie v zmysle síly testu zmení, ak zmeníme alternatívu a generovať budeme data z $t$ rozdelenia s ťažkými chvostmi (t.j. nízke stupne voľnosti)?

```{r, fig.width = 10, fig.height = 8}
N <- c(10, 50, 100, 200, 500, 1000, 2000, 5000)
tdf <- c(2, 5, 10, 50)
set.seed(1234)

PWR <- list()
for (d in 1:length(tdf)){
  power <- NULL
for (n in N){
  p1 <- p2 <- p3 <- NULL
for (i in 1:100){
  x <- rt(n, df = tdf[d])
  p1 <- c(p1, as.numeric(ks.test(x,"pnorm",mean=mean(x),sd=sd(x),exact=FALSE)$p.value < 0.05))
  p2 <- c(p2, as.numeric(shapiro.test(x)$p.value < 0.05))
  p3 <- c(p3, as.numeric(jarque.bera.test(x)$p.value < 0.05))
}
power <- rbind(power, c(n, mean(p1), mean(p2), mean(p3)))
}
PWR[[d]] <- power
}

par(mfrow = c(2,2))
for (d in 1:length(tdf)){
  power <- PWR[[d]]
  plot(power[,4] ~ log10(power[,1]), col = "red", type = "l", pch = 21, bg = "red", xlab = "Logarimus rozsahu náhodného výberu", ylab = "Empirická síla   testu", main = paste("t rozdelenie (df = ", tdf[d],")", sep = ""), ylim = c(0,1))
  points(power[,4] ~ log10(power[,1]), pch = 21, bg = "red")
  points(power[,3] ~ log10(power[,1]), pch = 21, bg = "blue")
  points(power[,2] ~ log10(power[,1]), pch = 21, bg = "green")
  
  lines(power[,3] ~ log10(power[,1]), col = "blue")
  lines(power[,2] ~ log10(power[,1]), col = "green")
  abline(1,0, col = "black", lty = 3)
  
  legend(1, 1, legend = c("Shapiro-Wilk test", "Jarque-Beta test", "Kolmogorov-Smirnov test"), col = c("blue", "red", "green"), lty= rep(1,3), cex = 0.5)
}
```

Pri danej alternatíve - studentovo $t$ rozdelenie s 5 stupňami voľnosti sa zdá, že najsilnejším testom je Jarque-Bera test. 

<br><br>

#### <font color = "#880000">Samostatne</font>
<hr size="3" width="100%" noshade style="color:#440000" align="left" />
<ul>
<li>Dokážete vysvetliť sledovane správanie sa síly jednotlivých testov?</li>
<li>Použijte podobnú simulačnú štúdiu pre iné alternatívy a pre iné testy.</li>
<li>Rozmyslite si podobnu simulačnu štúdiu nižšie, ktorej cieľom je  porovnávať dosiahnutú/empirickú hladinu?</li>
<li>Dokážete vysvetliť sledované rozdiely v jednotlivých obrázkoch?</li>
</ul>
<hr size="3" width="100%" noshade style="color:#440000" align="left" /  >
<br><br>

```{r, fig.width = 10}
N <- c(10, 50, 100, 200, 500, 1000, 2000, 5000)

set.seed(1234)
power <- NULL
for (n in N){
  p1 <- p2 <- p3 <- NULL
for (i in 1:100){
  x <- rnorm(n)
  p1 <- c(p1, as.numeric(ks.test(x,"pnorm",mean=0,sd=1,exact=FALSE)$p.value < 0.05))
  p2 <- c(p2, as.numeric(shapiro.test(x)$p.value < 0.05))
  p3 <- c(p3, as.numeric(jarque.bera.test(x)$p.value < 0.05))
}
power <- rbind(power, c(n, mean(p1), mean(p2), mean(p3)))
}


par(mfrow = c(1,1))
  plot(power[,4] ~ log10(power[,1]), col = "red", type = "l", pch = 21, bg = "red", xlab = "Logarimus rozsahu náhodného výberu", ylab = "Dosiahnutá hladina testu", main = "", ylim = c(0,0.4))
  points(power[,4] ~ log10(power[,1]), pch = 21, bg = "red")
  points(power[,3] ~ log10(power[,1]), pch = 21, bg = "blue")
  points(power[,2] ~ log10(power[,1]), pch = 21, bg = "green")
  
  lines(power[,3] ~ log10(power[,1]), col = "blue")
  lines(power[,2] ~ log10(power[,1]), col = "green")
  abline(0.05,0, col = "black", lty = 2, lwd =2)
  
  legend(1, 0.4, legend = c("Shapiro-Wilk test", "Jarque-Beta test", "Kolmogorov-Smirnov test"), col = c("blue", "red", "green"), lty= rep(1,3))
```

<br><br>

### <font color = "#880000"><b>3. Knižnica 'shiny'</b></font>
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).<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 plnohodnotne fungovať - 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 nebude potrebne inštalovať `shiny` server na hosťovskom počítači. Niekoľko príkladov si ukážeme pouze lokálne a ako  hosťovský server nám bude slúžiť priamo počítač, ktorý ma každý k dispozícii a na ktorom pracuje.<br>
<b>Táto čast slúži pouze jako ilustrácia rôznych možnosti, ktoré má užívateľ programu R k dispozícii. </b><br><br> 

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()`, ktorá bude slúžiť ako vstup pre program R  a zároveň bude poskytovať potrebné zdrojové informácie pre program 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 časti - webovú stránku `ui`, aj shiny server `server` - lze následne doplniť o dodatočné informácie, HTML kód,  rôzne preddefinované moduly na zadávanie jednotlivých príkazov, či konkrétnych dat
do programu R, a tiež moduly na vizualizáciu výstupov (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ívna a nie je možné zadavať prostredníctvom 
konzoly dalšie príkazy. R-ko očakáva, že príkazy bude dostavať prostredníctvom otvoreného a aktivného webového prehliadača. 
Keďže nateraz nemáme v prehliadači nič vytvorené (príkaz `fluidPage()` je prázdny), musíme R-ko ukončiť manuálne, buď kliknutím na tlačítko 
<font color = "red"> STOP</font>, alebo stlačením kombinácie kláves CTRL + C. 
<hr size="3" width="100%" noshade style="color:#440000" align="left" /  >
<br><br>

Všetky hodnoty, ktoré potrebujeme R-ku predať ako vstupné hodnoty, sú automaticky uložené v liste (R object) s názvom `input` a na jednotlivé zložky listu sa odkazujeme pomocou ID nálepky pri vstupe. Analogicky, všetky výstupy, ktoré server pripraví, 
aby boli dostupné prostredníctvom klientskej webovej stránky, sa ukladajú do listu (R object) s názvom `output` a na jednotlivé zložky 
sa opať odkazujeme 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}$, 
kde všetky tri parametre ($\mu$, $\sigma^2 > 0$ aj $n \in \mathbb{N}$) môže nastaviť užívateľ prostredníctvom webového prehliadača. <br>
Histogram a odhad hustoty sa interaktvívne vykreslí priamo v prehliadači, hneď po zadaní vstupných hodnot. 

```{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 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 - program R totiž očakáva vstupné hodnoty, 
ktoré budu zadané pouze 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>


#### <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é programu R na sever `shiny` 
<ul>
<li>V knižnici `shiny` je niekoľko rôzných nástrojov na zadávanie vstupných hodnôt - viď napr. <a href = "http://shiny.rstudio.com/tutorial/lesson3/">http://shiny.rstudio.com/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 = "http://shiny.rstudio.com/tutorial/lesson4/">http://shiny.rstudio.com/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>



## <font color = "#880000"><b>Domáca úloha</b></font>
### (Deadline: 6. cvičenie | St: 15.12.2020)
 
<ul>
<li>Vytvorte jednoduchú simulačnú štúdiu - napr. pre zistenie skutočného pokrytia intervalu spolahlivosti, skutočnej dodržanej hladiny testu, síly testu, konzistencie nejakého konkrétneho odhadu a podobne.</li>

<li>Vytvorte tabulku s hlavnými výsledkami simulácie a simulácie doplňte o vhodný obrázok, ktorý bude výsledky názorne ilustrovať.</li>

<li>Tabulku spolu s vytvoreným obrázkom doplňte do Váško PDF súboru, ktorý na záver semestra odošlete ako podklad pro zápočet. </li>
</ul>

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