NMSA230 - Softwarové prostředky
pro matematiku a stochastiku

Zimný semester 2017/2018 | Cvičenie 6/7 | Po 08/01/18



Sweave | Knit | Shite


Program šiesteho/siedmeho cvičenia NMSA 230
  • R-ko vs. LaTeX
  • R-package Sweave
  • R-package Knitr
  • Interaktívne aplikácie prostredníctvom Shine

Užitočné materiály pre prácu s LaTeX-om
  • Tobias Oetiker a kol.: Ne příliš stručný úvod do systému LaTeX 2ε. (PDF súbor)
  • Kolektív AF UPOL: Drsný úvod do LaTeX-u. (PDF súbor)
  • Warbrick, J.: Essential LaTeX ++ (PDF súbor)

  • Olšák, P.: Typografický systém TeX, Konvoj, 1995.
  • Knuth, D.: Computer and Typesetting Series, Vol. A: The TeX Book, Addison Wesley, 1986.
  • Knuth, D.: Computer and Typesetting Series, Vol. B: TeX The Program, Addison Wesley, 1986.


1. Sweave package

Sweave je balíček pre štatistický program R, ktorý umožňuje integráciu Rkového kódu priamo v LaTeX-ovom kóde. Umožňuje tak vytvárať dynamické reporty, ktoré je možne jednoducho a priamočiaro updatovať v prípade, že dôjde k zmene v Rkových výpočtoch, alebo podkladovom datovom súbore.

Podrobnejší help a návod na používanie funkcie Sweave() ako PDF súbor prípadne ako klasický R-kový help:

help("Sweave", package="utils")
Jednoduchý príklad na použitie funkcie Sweave() v programe R:


Samostatne


Použijte Rnw súbor a otvorte ho v programe RStudio. Súbor najrpv zkompilujte (pomocou tlačítka Compile PDF v menu) a následne súbor doplňte o vlastnú čast R-kového zdrojového kódu. Pridajte minimálne jeden obrázok a finálny Rnw súbor opäť skompilujte a vytvore výsledny PDF súbor.



2. R to LaTeX

Niekedy je užitočné nevytvárať pomocou programu R celý zdrojový kód pre LaTeX, ale vytvoriť pouze určitú časť (napr. tabuľky), ktoru do LaTeX-ového zdrojového kódu pouze prídáme pomocou príkazu \include{} prípadne \require{}.

V programe R existuje celá řada rôznych balíčkov, ktoré umožňuju vytvárať tabuľky, časti textu, prípadne celé PDF subory. Väčšinou sú ale mierne obmedzujúce v tom, že ponúkaju len určitú škálu možných nastavení a adaptácii, ktoré nemusia vždy stačiť, prípadne sedieť naším požiadavnkám.

Veĺmi výhodne je v tomto smere naučiť sa pracovať s R-kovou funkciou cat(), ktorá dokáže (okrem mnohých iných vecí) vytvoriť podkladovy LaTeX-ový súbor (tex súbor) priamo ušitý na mieru.

?cat


Samostatne


Pomocou helpu sa podívajte ako pracuje a funguje funkcia cat(). Použijte ju a pomocou nej vytvorte jednoduchu tabulku (súbor tabulka.tex), ktorá bude obsahovať základné popisné charakteristiky k dátovému súboru, ktorý ste si na začiatku semestra zvolili.



3. Knitr package

Knitr (GNU General Public License) je knižnica pre štatistický software R, ktorá umožňuje integráciu R-kového zdrojového kódu priamo do LaTeX-ového dokumentu, HTML Markdownu prípadne iných.
Inštalácia balíčku pomocou príkazu

install.packages("knitr")

V niektorých grafických interfacoch (napr. RStudio) je tento balíček inštalovaný defaultne.

Niekoľko príkladov ako používať Knitr v programe R:
  • podkladový súbor z prvého cvičenia predmetu NMSA230: Rmd súbor
  • podkladový súbor z druhého cvičenia predmetu NMSA230: Rmd súbor


Samostatne


Použijte podkladové Rmd súbory z prvého a druhého cvičenia a otvorte ich v programe RStudio. Súbor zkompilujte (pomocou tlačítka Knit HTML v menu) a následne súbor doplňte o vlastnú čast R-kového zdrojového kódu. Pridajte minimálne jeden obrázok a finálny Rmd súbor opäť skompilujte a vytvore výsledny HTML súbor.



4. Knižnica shiny a program R

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ť pribeh výpočtu/analýzy nejakého konkrétneho procesu (napr. štatistickej analýzy datového súboru).

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).

Inšpirácia a niekoľko príkladov vytvorených pomocou knižnice shine: http://shiny.rstudio.com/gallery/

Pre účely tohto cvičenia nebude potrebne inštalovať shine 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.

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

  • nainštalovať a načítať knižnicu shine:

    library("shiny")
  • vytvoriť (HTML) stránku pomocou R-kového príkazu fluidPage(), ktorá bude slúžiť ako vstupná informácia pre program R - pomocou tejto stránky užívateľ kontroluje aplikáciu a modifikuje výpočty/analýzy;
  • naprogramovať príslušný R-kový kód, ktorý beží na shiny serveri a ktorý pracuje so vstupnými informáciami a po spracovaní a vyhodnotení R-kového zdrojového kódu pripraví príslušny výstup (ktorý sa uživateľovy zobrazí priamo na webovej stránke);
  • spustit samotnú shiny aplikáciu pomocou príkazu shinyApp();

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

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) 



Doležité


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 “Hallo 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 STOP, alebo stlačením kombinácie kláves CTRL + C.



Všetky hodnoty, ktoré potrebujeme R-ku predať ako vstupné hodnoty, sú automaticky uložené v liste (R object) s názvom input a
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.

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.
Histogram a odhad hustoty sa interaktvívne vykreslí priamo v prehliadači, hneď po zadaní vstupných hodnot.

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(
    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)



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

Pomocou nástrojov na zadávanie vstupných hodnôt na ľavej strane je možné modifikovať nastavenie generátoru náhodných čísel, na základe čoho sa vygeneruje nový/iný náhodný výber a príslušne sa prekresli histogram a odhad hustoty.

Príkazový riadok v RStudio zostáva naďalej aktívny a nie je možné zadavať nové príkazy - program R totiž očakáva vstupné hodnoty, ktoré budu zadané prostredníctvom nástrojov na webovej stránke. V prípade, že chceme R sekciu ukončiť, je nutné stlačiť tlačítko STOP alebo kombináciu kláves CTRL + C.

Doležité


Všimnite si, akým sposobom funguje zadávanie vstupných hodnot a akým spôsobom sú tieto hodnotý predané programu R na sever.
  • v knižnici shiny je niekoľko rôzných nástrojov na zadávanie vstupných hodnôt - viď napr. http://shiny.rstudio.com/tutorial/lesson3/
  • 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;
  • 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.
  • v druhej časti príkazu fluidPage() umiestňujeme na webovú stránku pripravené výstupy, ktoré predal server po spracovaní R-kom.
  • 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. http://shiny.rstudio.com/tutorial/lesson4/;



Samostatne


Všimnite si, akým sposobom funguje zadávanie vstupných hodnot a akým spôsobom sú tieto hodnotý predané programu R na sever.
  • Využijte ďalšie možnosti, ktoré ponúka knižnica shine 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.).
  • Pokuste sa využiť rôzne možnosti zadávania vstupných informácii a tiež rôzne možnosti prezentovania výstupu.
  • 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.
  • Komplexnejšia ukážka s využitim viacerých panelov pre rôzne varianty výstupov je napr. nižšie:

    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)
  • Vyskúšajte, čo výššie uvedený skript robí a pokuste sa ho podľa vlastných nápadov vhodne modifikovať. Vygenerovaná webová stránka by mala vyzerať podobne:




Final submission (credit requirement)

(Deadline: End of the term: Friday, 12/01/18)

  • Vytvorte Rkový kód, ktorý bude generovať LaTeX-ovú tabuľku ako samostatný tex súbor, ktorý následne vložíte do PDF reportu pomocou príkazu \iclude{} prípadne \require{}.



Finálny PDF súbor, ktorý ste vytvorili a v priebehu semestra doplňovali o parciálne úlohy pomenujte prijmeni_jmeno.pdf a ho odošlite emailom na adresu maciak AT karlin.mff.cuni.cz, a to najneskôr do 12.01.2018. Tento report bude základným podkladom pre udelenie/neudelenie zápočtu za predmet NMSA230.

Zápočty budú udelené po doručení PDF dokumentu s vypracovanými úlohami.