Sunteți pe pagina 1din 61

R Shiny package: Developing

Web Applications in the area of


E-business
curs6
Introducere R-Shiny

R Shiny=R+interactivity+web

In cuvinte: Pachetul open source R de la Rstudio cu care


se creaza aplicatii web interactive în scopul de a crea -
analiza și vizualizarii cu R

Nu sunt necesare in procesul de implementare


cunostinte de HTML/CSS/Javascript

….dar complet personalizabil și extensibil cu HTML / CSS


/ JavaScript
Aplicațiile RShiny
-limbajul R este un limbaj de programare special creat pentru analiza statistică
a datelor și care a câștigat popularitate în segmentul corporate.
-dispune de biblioteci ce acoperă aproape orice sarcină în analiza datelor și
zona grafică
-biblioteci, în cele mai multe cazuri, au fost create de către utilizatori

Aplicațiile Rshiny sunt interactive.

Valorile de intrare se pot schimba în orice moment=> iar valorile de ieșire


trebuie să fie actualizate imediat pentru a reflecta aceste schimbări.

Modificarea valorilor de intrare


va determina părțile din dreapta ale codului R să fie reexecutate,
ceea ce va determina la rândul său, orice ieșiri modificată să fie actualizate.
Reactive

În Shiny, există trei tipuri de obiecte în programare reactivă:

surse reactive, conductori reactivi și puncte finale reactive:


reprezentate cu aceste simboluri:
Aplicaţii simple
Structura cea mai simplă a unui program reactiv implică doar o sursă și un punct final:
Reactive sources si endpoints

Sursa tipică este un input a unui user prin intermediul interfetei browser. Ex:

surse reactive: selectare item, completez un input sau click pe un buton

Punct final reactiv –ceva ce apare utilizatorului în browser ca rezultat al sursei reactive va apăra
un grafic sau un tabel de valori
Într-o aplicație simplă Shiny,
+sursele reactive sunt accesibile prin obiectul de intrare,
+punctelede final reactive sunt obiectele de tip output.
Se vb de surse și puncte finale care sunt de fapt intrari şi ieşiri
EXŞ structură simplă, cu o singură sursă și un punct final, este utilizată de exemplul
01_hello.
Ex Hello
Obiectul output$distPlot este un obiectiv final reactiv și utilizează intrarea sursă reactivă

Ori de câte ore input$obs se schimbă output$distPlot este anunţat ca trebuie să se reexecute.
Intr-un program cu o interfaţă user interactivă , acest lucru implică setarea unui handler de
eveniment + scrierea unui cod sursă ce citeste valori şi transferă date.
=>Shiny face toate acestea si impune doar sa se scrie R cod

https://gallery.shinyapps.io/01_hello/.
Sursa reactivă poate fi conectată la mai
multe puncte finale și invers.
Într-o aplicație Shiny, nu este nevoie
să se descrie explicit fiecare dintre
aceste relații =>
se scrie cod R pentru fiecare schimbare
a componentei de intrare;( Shiny
manipulează automat aceste detalii.
In ex: de câte ori se schimba valoarea lui
input$nBreaks expresia care
generează graficul va fi re-executată
automat.
Ori de câte ori se modifică valoarea
variabilei input$individualObs graficul şi
tabelul vor fi re-executate automat.
Majoritatea funcţiilor de final +rezultatele
lor sunt trimise automat spre browser.
Reactive conductors(Conductori reactivi)
conductori reactivi sunt componente ce apar intre puncte de final şi surse.
într-un grafic al structurii reactive.
I.Un conductor poate fi
1. dependent și are dependenți.
2. atât părinte cât și copil
II.Sursele pot fi numai părinți (pot avea dependenți)
III. obiectivele finale pot fi doar copii (pot fi dependenți) în graficul reactiv.
Conductorii reactivi pot fi utili pentru încapsularea unor operații lente sau computerizate.
Recapitulare
Sursele reactive pot semnala obiecte în flux pe care trebuie să le re-execute.
Conductorii reactivi sunt plasați undeva între surse și punct final de pe graficul reactiv.
Ele sunt utilizate în mod obișnuit pentru încapsularea operațiilor lente.
Puncte finale reactive pot fi re-executate de mediul reactiv și pot solicita executarea
obiectelor din amonte.
Nodul copil este dependent sau are o dependență de nodul părinte.
Implementări ale surselor, conductoriși punctelor finale: valori, expresii și observatori
Valorile reactive reprezintă o implementare a surselor reactive;
Expresiile reactive sunt o implementare a conductorilor reactivi. Aceștia pot accesa
valori reactive sau alte expresii reactive și returnează o valoare.
Observatorii sunt o implementare a punctelor finale reactive. Aceștia pot accesa surse
reactive și expresii reactive și nu revin la valoare;
Reactive values
conțin valori care pot fi citite de alte obiecte
reactive.
Obiectul de intrare (input) este un obiect
ReactiveValues, care arată ca o listă și conține
mai multe valori individuale reactive.
Valorile din intrare (input) sunt setate prin
introducerea de la browserul web.
Reactive expressions

pot fi utile pentru memorarea rezultatelor oricărei


proceduri care apare ca răspuns la intrarea utilizatorului,
incluzând:

1. accesarea unei baze de date


2. citirea datelor dintr-un fișier
3. descărcarea de date prin rețea
4. efectuarea unui calcul costisitor
Observe()
Observatorii sunt blocuri de cod care efectuează acțiuni.

Ele sunt executate ca răspuns la modificarea valorilor reactive / expresii.

Ei nu redau o valoare-, nu își stochează valorile returnate

-au efecte secundare - de obicei, aceasta implică trimiterea de date către browserul
web.

-Obiectul de ieșire arată ca o listă și poate conține mai mulți observatori individuali.
renderText () -fiecare returnează o funcție care returnează o valoare. Acestea sunt de
obicei folosite astfel:

output$number <- renderText({ as.numeric(input$n) + 1 })


-Acest lucru vă poate face să credeți că observatorii vor returna valori
Funcția returnată de renderText () nu este un observator / punct final.
Când este atribuită output$number, funcția returnată de renderText () se înfășoară
automat într-o altă funcție, care este un observator. Funcția de împachetare este
utilizată deoarece trebuie să facă lucruri speciale pentru a trimite datele în browser.
Puteți defini propriile variabile reactive
Valorile reactive pot fi utilizate numai în contexte
reactive

Render-funcția este un context reactiv


reactive({...}) pentru a atribui o variabilă reactivă
observe({...}) pentru a accesa o variabilă reactivă
OBS: Variabila reactivă înseamnă orice lucru care
depinde de aceasta este re-executat automat
Programarea reactivă
este o paradigmă de programare orientată în jurul fluxurilor de date și a propagării
schimbării
-în limbajele de programare se pot forma ușor fluxuri de date dinamice sau statice iar pe baza
modelului de execuție existent se vor propaga automat schimbări prin fluxul de date.
-este un stil de microarhitectura care implică rutare inteligentă şi consumul de
evenimente, toate care combină pentru a schimba comportamentul.
-Ideea de bază din spatele de programare reactivă este că există anumite datatypes care
reprezintă o valoare în timp. Calculele care implica aceste valori în schimbare în timp vor avea
la rândul lor valori care se schimba in timp.
-a=b+c în programarea reactivă valoarea lui a va fi actualizată automat ori de câte ori valorile
lui b și c se modifică fără a mai reexecuta a=b+c
-a fost propusă în primul rând ca o modalitate de a simplifica crearea de interfețe
utilizator interactive, animații în sistemele de timp real, dar este, în esență, o paradigmă
de programare generală.

-De exemplu, într-o arhitectură de model-view-controller, programare reactivă poate


permite modificări în model care să se reflecte în mod automat în View
Probleme softurilor sunt legate de scalare, așteptări, și importanța softului în zilele noastre
unele paradigme ale trecutului nu se pot scala până în prezent, și cu siguranță nu în
viitor.
Soluția este dezvoltarea de aplicații Reactive
sunt construite pe patru principii directoare.

-aplicatie responsive-este scopul principal

Aplicația responsive este scalabil și


rezistentă(elastică, activă). Responsiveness
este imposibil de realizat fără aceste 2
caracteristici.

arhitectură bazată pe mesaj temelia pe care


se creaza de aplicații scalabile, elastice și
receptive.(scalable, resilient, and responsive)

toate aceste concepte se impun să fie aplicate împreună pentru a dezvolta software-
ul de calitate într-un context modern.
Responsive(sensibil)
O aplicație responsive- este rapidă în scopul de a reacționa la toți utilizatorii ei pentru a asigura
utilizatorilor o experiență pozitivă în mod constant.
Agerimea și experiența pozitivă de utilizare pozitivă, în diferite condiții, cum ar fi defectarea
eșecului unui sistem sau a unui trafic intens dus pănă la extrema superioară depinde de cele
două trăsături ale unei aplicații reactive: capacitatea de resilience și scalabilitate.

O arhitectură bazată pe mesajul oferă fundamentul general pentru un sistem responsive.

De ce o arhitectură bazată pe message-driven este așa de importantă pentru responsiveness?


Răspuns:lumea funcționează asynchronous. (decuplează pe cel care face acțiunea din timpul și
spațiu prevăzut realizării unei acțivități)
Exemplu: In procesul de prerararea a unei cafele constați că îți lipsește zahărul și frișcă
Scenariu:
Pas1. Pui cafea la făcut
Pas2. pleci la magazin să cumperi zahăr+frișcă
Pas3.te întorci acasă
Pas4.Bea imediat cafea.
Pas5.Bucură-te de viață
Resilient
-este caracteristica care generează probleme în cadrul oricărei aplicații web.
-o aplicație web modernă se impune ca în nucleul ei să fie resilientă în scopul de a rămâne
responsivă atât în lumea reală cît și în cea de test.
Aplicații web prezente ce au caracteristica resilient îndeplinită: compuse dintr-un număr de
alte aplicații, integrate prin intermediul unor servicii web și alte protocoale de rețea.
O aplicație construită astăzi:
-poate depinde de un număr mare de servicii externe - 10, 20, sau chiar mai mult - în
afara propriei sale firewall de încredere. Acesta poate servi, de asemenea, un număr
mare de clienți externi (oameni și alte sisteme).
--se crează pe baza următoarelor răspunsuri la întrebări:
1. Analizeaza și modelează toate dependențe externe?
2. Rezultatele testelor de performanță pentru fiecare servici (în perioade de vârf și de
rezistență, verificarea funcționalităților site la prima experientă ) sunt adecvate cu
așteptările inițiale?
3. In nucleul application logic sunt incluse/ prevăzute coduri sursă destinate creșterii
performanței, evitării situațiilor de eșec eșecului etc.?
4. Toate scenariile de eșec ale fiecărui serviciu sunt testate și analizate continuu?
5. Analizeaza securitatea dependențelor externe continuu (recunoscând astfel că
integrarea sistemului cu mediul extern crează continuu vulnerabilități?
- Performanta, rezistenta si securitatea sunt toate aspectele ale concenceptului de resilient.
Aplicațiile web prezente se impun să fie resiliente la toate nivelurile, nu doar câteva.
Scalable
Resiliency și scalability sunt interdependente în procesul de creare a unei aplicații web
responsive
Un sistem scalabil este ușor de actualizat la cerere, în scopul de a asigura capacitatea
de reacție în diferite condiții de sarcină.(trafic intens , posibilitate de oferire a aplicației în mai
mult limbi etc)
Concurența în Modelul Message-driven
MVC frameworks sunt
-construite astfel încât se bazează pe thread-uri (dificil de construit)
-împart stări transformabile
-alocă câte un fir de execuție pt fiecare cerere
-Accesul concurent în stari transformabile - variabile și instanțe de obiecte - gestionate cu locks
și alte structuri de sincronizare complicate.

-Aceste trăsături + inputuri dinamice+ limbaj interpretat de exemplu Ruby => o aplicație care are
aceste caracteristici ajunge rapid limitele superioare de performanță și scalabilitate.
-În cazul în care un limbaj prezintă aceste caracteristici se numește limbaj de scripting.
Limbaj de scripting este utilizat pentru a conecta componente de sistem disparate.

Deci, scalarea se referă la determinare unei modalități de utilizarea eficientă a resurselor deja
disponibile. Elasticity pp adăugarea la cerere, de noi resurse sistemului generate din
nevoile de schimbare de sistem. Capacitatea de a scala la cerere este obiectivul final de
scalabilitate a unei aplicații reactive.
Message-driven
-stă la baza aplicațiilor reactive.
-o caracteristica reactivă a unei aplicații poate fi determinate de un event-driven, actor-based,
sau de un mixt a celor 2

Un sistem bazat pe evenimente


-se bazează pe evenimente care sunt monitorizate de zero sau mai mulți observatori.
-apelantul nu are nevoie pentru a bloca în așteptare pentru un răspuns la o cerere din
rutina.
- Evenimentele nu sunt direcționate către o anumită adresă
O aplicație bazată pe actori concurrency
-este o extensie a arhitecturii în cazul în care mesajele sunt direcționate către un
destinatar, care se întâmplă să fie actor. Mesajele pot trece granițele firului sau să fie
transmise către cutia poștală a altui actor pe un server fizic diferit. Acest lucru permite o
elasticitate - scalarea la cerere .
Principala diferență între mesaje și evenimente este că mesajele sunt direcționate în
timp ce evenimentele se întâmplă. Mesajele au o destinație clară în timp ce
evenimentele pot fi observate de către (0-N) observatori zero sau mai multe

Detalii: Benjamin Erb’s Diploma Thesis, Concurrent Programming for Scalable Web
Architectures, http://berb.github.io/diploma-thesis/original/
Concluzie

Programarea reactiva- paradigma pentru dezvoltatorii de software


moderne
-Indiferent de limba sau setul de instrumente ales, singura modalitate de
a satisface așteptările utilizatorilor în procesul de construire a unei
aplicații web- scalabilitate și capacitatea de adaptare dețin rolul central,
în scopul de a atinge capacitatea de reacție.
Input +Output
Pentru interactivitate avem
input şi output

Input+ lucruri pe care


utilizatorul le poate schimba
Output- obiectele R pe care
utilizatorul le poate vedea,
depind adesea de intrările
Ce este o aplicaţie Shiny

Este o pagina web(UI) conectată la un computer/server pe care ruleaza un live R


session (Server)
Utilizatorii pot manipula UI, ceea ce va determina serverul să actualizeze Ui
(prin rularea de cod R)
Aplicația Rshiny---app
Pas1. install.packages(“shiny”)
Pas2. creare director in care se păstrează un fișierele numite: server.R respectiv ui.r
Pas3. creare fișier ui.R
- este doar un document web care se afișează în browser utilizatorului
- cod HTML scris cu ajutorul funcțiilor Shiny
- este responsabil pentru crearea layout-ului aplicației app
- se precizează lui Shiny unde se transmit datele
-conține widget care capturează intrărilre userilor
-afișează output-urile: titlu, text input, radio buton, drop down list, grafice, etc.
Pas4. creare fișier server.R
- set-uri de instrucțiuni cu ajutorul cărora se prelucrează input-urile provenite de la
user obținand output-urile care se vor afișa de către scriptul ui.r
-este responsabil pentru logica aplicației;
este un set de instrucțiuni care transmit paginii web ce afișează atunci când
utilizatorul interacționează cu pagina.
Creare aplicație Shiny vidă
Toate aplicații au următorul template
library(shiny) ui <- fluidPage()
server <- function(input, output) {}
shinyApp(ui = ui, server = server)
Aplicația: - inițializează unui UI gol, un server gol și rulează o aplicație app folosind aceste
părți goale.
-șablon se salvează într-un nou fișier numit UI app.R într-un nou director
Important
-numele fișierului este app.R, în caz contrar Shiny nu o recunoaște ca aplicație
-obligatoriu se plasează această aplicație în propriul său fișier, în care pot exista și alte
fișiere care sunt utilizate de către aplicația.
După salvarea fișierului, RStudio ar trebui să recunoască faptul că aceasta este o
aplicație Shiny - Run la schimbarea de sus pentru a rula App.

clic buton RunApp=> lansare în execuție a aplicației. Nu se afișează nimic pentru că este o aplicație
goală, în consola apare un text tipărit sub formă de ascultare de pe http://127.0.0.1:5274 și-că
nu se pot executa alte comenzi in consola. datorită faptului că R este ocupat-sesiune R
pornește în prezent o aplicație Shiny și asculta pentru interacțiunea cu utilizatorul.Opri
reaplicație -activare tastă Escape.
Creare template app utilizând RStudio

-Selectare menu File > New Project > New Directory > Shiny Web
Application.
-Efect: RStudio va crea un nou director și initializează o app Shiny în el
-App Shiny rezultată - nu va avea un fișier app.R
-în schimb va avea două fișiere: ui.R și server.R.

-un singur fișier pentru UI și un fișier pentru codul de server. =>


Modalitate indicată de a scrie aplicații Shiny, pt aplicații complexe care
implică cantități sonsistente de cod.
UI.R
Adăugarea unui text simplu la interfața de utilizare
-se pot introduce șiruri R în interiorul fluidPage () pentru a genera text neformatat astfel

fluidPage(“Hello world", “today")

-Adăugarea unui text formatat, cu elemente HTML-cu ajutorul funcțiilor Shiny aplicate tagurilor
HTML cum ar fi de exemplu:
-funcția h1() pentru un antet de nivel superior (în HTML avem <h1> ),
- funcția h2 () pentru un antet secundar (în HTML-<h2>),
-funcția strong () pentru a face textul cu caractere aldine (în HTML <strong>),
- funcția em () pentru a face textul italic (în HTML (<em> ), si multe altele.
-Funcție br() pt a forța trecrea la o noua linie
-img () pentru o imagine,
-a () pentru un hyperlink.

Obs: orice argument precizat într-o funcție HTML devine un atribut al elementului
HTML definit de funcție,iar orice argument anonim va fi un copil al elementului.
De exemplu, creare div cu un text albastru :
div ("acest lucru este albastru", style = " color : albastru;").
Adăugare un titlu
-adăugarea unui titlu la app se poate face cu funcția H1() -preferă utilizarea funcției
Shiny titlePanel ().
Funcția titlePanel () - adaugă un mare text vizibil ca titlu în partea de sus a paginii,
- stabilește, "oficial", titlul paginii web=> mai exact numele paginii
în browser-ul, este titlu adică textul trecut titlePanel ca parametru.
fluidPage(
titlePanel(“Prima aplicație Shiny"),
...
)
Adăugarea unui layout
sidebarLayout () -adăugă o structură simplă.
- structura oferă un aspect simplu pe două coloane, o colană laterală
mai mică și un panou principal mai mare.
Aplicația Shiny va fi contruită astfel încât toate intrările pe care utilizatorul le poate
manipula va fi în bara laterală stângă, iar rezultatele vor fi afișate în panoul principal de
pe partea dreaptă.
Cod sursă după titlePanel ()
sidebarLayout(
sidebarPanel(“Inputs se vor plasa aici"),
mainPanel(“Rezultatele vor fi plasate aici") )
toate argumentele din interiorul fluidPage () trebuie să fie separate prin virgulă.
library(shiny)
ui <- fluidPage(
titlePanel(“Prima aplicație Shiny"),
Fișierul UI.r sidebarLayout( sidebarPanel(“Inputurile vor fi afișate aici"),
mainPanel(“Rezultatele vor fi afișate aici") ) )

library(shiny)
Fișierul Server.r # Define server logic required
shinyServer(function(input, output) {

})
UI.r modificare pt a obține următorul
layout
library(shiny)
ui <- fluidPage(
titlePanel(title="Prima aplicație Shiny"),
sidebarLayout( position="right",
sidebarPanel(h3("Inputurile vor fi afișate aici"),h4("widget4"),h5("widget5")),
mainPanel(h4("Rezultatele vor fi afișate aici"),h5("acesta este output")) ))
Outputs
Plots, tables, text – tot ce se poate crea cu R şi utilizatorii vad
Se initializează un spațiu gol pentru obiect până când este
creat
Outputs
Construire output
1. Salvare obiect in output$
Construire output
2. Construire obiecte cu render
render()-crează output reactiv pt a se
afişa in UI
3. Construire output
Access la valori input cu input$
Reactiv
input$num este o valoare reactivă

output$myplot depinde de input$num


input$num changes → output$myplot reacţionează

Toate inputurile sunt automat reactive, daca foloseşti fiecare input in interiorul lui render*
function, output-ul va fi refăcut la fiecare modificare a inputului
Instalare

Install R--https://cran.r-project.org/bin/windows/base/old/3.1.2/
Install R-Studio-https://cran.r-project.org/bin/windows/base/old/3.1.2/
Install R-Packages (If needed)

Detalii
http://rprogramming.net/download-and-install-rstudio/
http://web.cs.ucla.edu/~gulzar/rstudio/
O sursă reactivă poate fi conectat la mai multe puncte finale, și vice-versa. Aici este o
aplicație Shiny cu un grad ridicat de complexitate:
Dezvoltarea aplicațiilor web se poate realiza în diferite moduri

Shiny Server (AGPLv3)


https://github.com/rstudio/shiny-server •

Shiny Server ”Pro” Secure u


Access-ul utilizatorilor securizat, aplicații de reglare a performanței , monitor de utilizare a
resurselor și deține suport direct de la R Studio, Inc.
https://www.rstudio.com/pricing/

• Shiny gazduit pe rstudio.com

http://www.shinyapps.io

Observație: Cunoștințe de bază de cod R ușurează procesul de învățare


Ce este Shiny App?
Este o pagina web(UI) conectată la un computer/server pe care ruleaza un live R session
(Server)

Utilizatorii pot manipula UI, ceea ce va determina serverul să actualizeze Uis


(prin rularea de cod R)
Shiny Apps pot fi dezvoltate pe baza următorului template in R

Ui: funcții R imbricate care montează o interfață de utilizator HTML pentru aplicația

Server:O funcție cu instrucțiuni referitoare la modul de a construi și reconstrui obiectele R


afișat în interfața de utilizare(UI)

shinyApp: Combina ui și server într-o app funcțională

Template-ul se salvează app.R


•în mod alternativ, șablonul se poate diviza în două fișiere numite ui.R și server.R:

Obs: Nu este nevoie să se apeleze shinyApp()

• se salvează fiecare aplicație ca un director care conține un fișier app.R (sau un fișier ui.R și un
fișier server.R), la care se pot adăuga fișiere opționale suplimentare

Numele directorului este numele app


(opțional) definește obiecte disponibile pt ambele părți: ui.R și
server.R
(opțional) folosit în modul casetă de prezentare
(opțional) data, scripts,etc
(opțional) director de fișiere împărțit cu web browsere(imagini,
CSS,.js, etc) Trebuie denumit “www”
Lansare apps cu
runAPP(<cale spre director>)
Exemple
LAYOUTS ȘI FUNCȚII
Dezvoltarea interfeței
Design & explorarea cadrului UI
• Intrări în cadrul UI
• Ieșiri în cadrul UI

Asamblarea UI cu HTML / CSS / ... widget-uri

Ajustări ale schemei de dispunere


Funții de intrare disponibile în R Shiny
Funcții panou disponibile

Organizarea funcțiilor panel și a elementelor într-un layout printr-o funcție de layout de forma
Filele tabPanels situate în partea de sus a ecranului în fiecare dintre ele oferă posibilitatea de a
naviga printre ele.