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