Shiny application

Vývoj Shiny aplikácie na optimalizáciu trás 150 150 cleandata

Vývoj Shiny aplikácie na optimalizáciu trás

V tomto blogu vám ukážem, ako som vytvoril Shiny aplikáciu na optimalizáciu trás pomocou R programovania a API služby HERE. Tento projekt je dôkazom, že Shiny dokáže viac než len dashboardy – umožňuje nám budovať plnohodnotné webové aplikácie. Spolu sa pozrieme na základné funkcie aplikácie a na to, ako rieši rôzne výzvy spojené s optimalizáciou trás.

router_app_blog

Aplikácia pre Optimalizáciu Trás

Shiny aplikácia, ktorej sa budeme venovať, je vytvorená pomocou frameworku Rhino od spoločnosti Appsilon. Táto Shiny webaplikácia slúži na optimalizáciu trás pomocou API služby od HERE. Aplikácia je plne vytvorená v programovacom jazyku R s využitím rôznych R knižníc.

UI aplikácie

Aplikácia je určená pre používateľov, ktorí potrebujú plánovať trasy medzi viacerými miestami, pričom zohľadňuje aktuálne dopravné podmienky a preferencie používateľa. Aplikácia umožňuje jednoduchý vstup adries a ďalších parametrov, automatické geokódovanie a vizualizáciu výslednej trasy na mape.

Je navrhnutá ako Proof of Concept (PoC) v rámci vývoja aplikácií v Shiny a R programovaní, a preto má určité obmedzenia. Premávka sa zohľadňuje len pri úvodnom určení poradia, keď sa všetky trasy porovnávajú v rovnakom čase odchodu. Pri tvorbe poradia sa však nezohľadňuje zmena dopravy pri druhej, tretej a ďalších trasách. Zmena dopravnej situácie je zahrnutá až v čase výpočtu finálnej trasy.

Vstupné parametre v Shiny aplikácii

Používateľ má možnosť zadať nasledujúce parametre pre optimalizáciu trasy:

  • Čas odchodu: Používateľ môže zadať čas a dátum odchodu z prvého miesta.
  • Typ optimalizácie: Trasu možno optimalizovať na základe najkratšej vzdialenosti alebo najkratšieho času potrebného na prejdenie.
  • Adresy miest: Hlavnou podmienkou pre výpočet trasy je zadanie adries. Používateľ vkladá adresy priamo do tabuľky.
  • Názov miesta: Pre lepšiu orientáciu môže používateľ zadať aj názov miesta, ktorý bude zobrazený v mape.
  • Štartovacie a koncové miesto: Používateľ môže označiť, ktoré miesto je štartovacie a ktoré koncové.

Adresy sa vkladajú do tabuľky a po ich zadaní sa nedajú editovať. Na druhej strane, riadky je možné odstrániť (pravým klikom na riadok) alebo pridať nové cez kontextové menu. Okrem toho aplikácia umožňuje hromadné vloženie adries, napríklad cez copy-paste priamo z Excelu. Shiny aplikácia spracováva tieto údaje s ohľadom na technické limity API volaní. Je dôležité, aby v jednej bunke bola vždy jedna adresa a táto adresa neobsahovala špeciálne znaky.

Veľkosť tabuľky, do ktorej používateľ zadáva adresy, je obmedzená na 4 záznamy. Toto obmedzenie bolo zavedené z dôvodu, že máme dostupných len 1000 volaní API denne pre HERE platformu. Každá požiadavka na trasu medzi bodmi spotrebúva tieto volania, a preto je nutné počet adries obmedziť, aby sme neprekročili limity dostupných volaní.

Aj napriek tomuto obmedzeniu je aktuálna veľkosť tabuľky dostatočná pre účely Proof of Concept (PoC), kde je cieľom otestovať a overiť základnú funkcionalitu aplikácie a jej schopnosť vykonávať optimalizáciu trás.

Geokódovanie adries

Všetky vložené adresy sa automaticky geokódujú (proces prevodu adries na geografické súradnice) pomocou OpenStreetMap (OSM) API. Po úspešnom geokódovaní sa jednotlivé miesta zobrazia na mape s príslušným označením. Používateľ tak môže vidieť presné pozície všetkých adries, ktoré zadal. Ak sa na mape niektorý bod neukáže, geokódovanie neprebehlo úspešne a riadok treba zmazať a pridať nový s presnejšou adresou. Štartovacie miesto a koncové miesto majú odlíšené značenie. Proces geokódovania môže trvať približne 1 sekundu na každú vloženú adresu.

Výpočet trasy

Aplikácia využíva R skript na optimalizáciu poradia miest podľa problému obchodného cestujúceho (TSP). Tým sa zabezpečí, že poradie miest je optimálne, hoci samotný výpočet trás medzi jednotlivými bodmi využíva HERE API. V tomto kroku sa využíva heuristický algoritmus, ktorý zohľadňuje celkovú trasu, čím predchádza suboptimálnym výsledkom, ktoré by mohli vzniknúť, ak by sme len postupne spájali najbližšie miesta.

To znamená, že HERE API slúži len na výpočet jednotlivých segmentov trasy medzi bodmi, ale optimalizáciu celkovej trasy robí samotná aplikácia.

Po zadaní všetkých potrebných parametrov môže používateľ spustiť výpočet optimálnej trasy stlačením tlačidla “Vypočítaj trasu”. Aplikácia následne vypočíta ideálne poradie miest na základe zvoleného parametra optimalizácie (či už podľa času alebo vzdialenosti).

Aplikácia automaticky pridáva 10 minútový prestoj ku každému miestu, aby sa zohľadnil čas potrebný na parkovanie a presun od auta na miesto stretnutia a späť. Okrem toho, výpočet trasy zohľadňuje aktuálnu dopravnú situáciu a premávku podľa času odchodu z jednotlivých miest.

Výpočet trasy trvá niekoľko sekúnd, avšak čas potrebný na spracovanie sa nedá presne odhadnúť, keďže závisí od počtu miest, ktoré je potrebné zvážiť.

Zobrazenie trasy na mape

Po vypočítaní trasy sa výsledná optimalizovaná trasa zobrazí na mape. Na mape sa zobrazí aj legenda, ktorá vysvetľuje poradie trás a zobrazuje jednotlivé úseky cesty. Používateľ môže tiež pohybom myši nad jednotlivými miestami zobraziť podrobnosti o danej lokalite (tzv. ‘on hover’ popis).

Používateľ má možnosť zobraziť podrobné informácie o vypočítanej trase stlačením tlačidla Detaily trasy. V zobrazenom okne sú k dispozícii nasledujúce informácie pre každé miesto:

  • Názvy miest odchodu a príchodu.
  • Čas odchodu z miesta,
  • Čas príchodu na miesto,
  • Dĺžka trasy v kilometroch,
  • Trvanie cesty v minútach.

Tieto údaje je možné jednoducho exportovať do formátov xlsx alebo csv, čo umožňuje ich ďalšie spracovanie alebo použitie.

Problémy, alternatívne služby a knižnice

Pri vývoji tejto Shiny webaplikácie v R sme narazili na problém, že matrix routing nie je podporovaný pre nové API kľúče služby HERE, čo potvrdil aj tvorca knižnice hereR. Toto je zásah zo strany HERE. Tento problém znamená, že momentálne je potrebné vykonať až n! dotazov na získanie matice n * n pre optimalizáciu trasy, zatiaľ čo pomocou matrix routing API by stačil len jeden dotaz. Free účet služby HERE pritom umožňuje len 1 000 dotazov za jeden deň, čo vytvára vysoké nároky na počet volaní. Na druhej strane, aplikácia zostáva časovo relatívne rýchla, no je obmedzená počtom volaní API.

Existujú aj alternatívne riešenia:

  • Google Maps: Poskytuje veľmi presné údaje o cestách, dopravnej situácii a trasovaní, no je nákladnejšie pri vyšších objemoch požiadaviek a má vlastné obmedzenia, čo sa týka počtu volaní.
  • Mapbox : Ponúka podobné služby ako HERE, vrátane optimalizácie trás a geokódovania. Môže byť dobrou alternatívou pre menšie projekty, pričom má flexibilné plány pre vývojárov.
  • OpenRouteService: Tento open-source nástroj je vhodný pre tých, ktorí potrebujú robustnú alternatívu s menšími obmedzeniami, aj keď môže byť menej presný v niektorých oblastiach ako komerčné riešenia.

Zhrnutie

Táto aplikácia je navrhnutá ako Proof of Concept (PoC), čo znamená, že jej cieľom je demonštrovať základné funkcie a možnosti optimalizácie trás v reálnom čase pomocou Shiny a R programovania. V tejto fáze vývoja ide predovšetkým o overenie technickej realizovateľnosti a schopnosti integrovať služby, ako je API od HERE a geokódovanie cez OpenStreetMap (OSM).

Aplikácia poskytuje základný súbor funkcií a môže byť ďalej rozšírená o pokročilé možnosti, ako sú rozšírené filtre pre optimalizáciu trás, lepšia správa miest alebo integrácia ďalších dátových zdrojov.

Video s ukážkou základnej funkcionality nájdete na YouTube.

Vývoj a nasadenie Shiny aplikácií v jazyku R 150 150 cleandata

Vývoj a nasadenie Shiny aplikácií v jazyku R

Shiny aplikácie umožňujú interaktívnu analýzu dát a vizualizácie v reálnom čase. Shiny, ako súčasť R ekosystému, ponúka flexibilitu a široké možnosti prispôsobenia, čo ho robí atraktívnou alternatívou k tradičným BI nástrojom. V článku jej výhody a nevýhody voči klasickým BI riešeniam, ako sú Power BI alebo Tableau. Zároveň sa pozriem na výzvy spojené s nasadením a údržbou takýchto aplikácií v produkčnom prostredí aj ukážkou reálnej aplikácie.

shiny_app

Úvod

Analyzovanie dát a vytváranie predikčných modelov sú dôležitými krokmi v rámci dátovej analýzy a data science workflow-u. Avšak, tento proces sa nekončí len analýzou samotnou. Konečným krokom je komunikovanie výsledkov. Či už ide o prezentovanie kľúčových zistení alebo o výstup v podobe dátového produktu, je nevyhnutné tieto výsledky efektívne odkomunikovať koncovým užívateľom a stakeholderom.

Existuje mnoho nástrojov, ktoré môžu byť použité na túto komunikáciu – od základných tabuliek a grafov v Exceli, cez prezentácie v PowerPointe, až po použitie pokročilejších dashboardových nástrojov ako PowerBI a Tableau. Pre špecifické potreby a väčšiu flexibilitu však môže byť nevyhnutné vytvoriť vlastné webové aplikácie, ktoré umožnia interaktívnu prácu s dátami. Jedným z nástrojov, ktorý umožňuje vytvárať takéto custom webové aplikácie, je Shiny v R (a aktuálne už aj Shiny v Pythone).

Čo je R Shiny

Shiny je framework od spoločnosti Posit (pôvodne R Studio), ktorý umožňuje vytvárať interaktívne webové aplikácie priamo v R. Je to nástroj pre R programátorov, ktorí chcú prezentovať svoje analýzy a vizualizácie interaktívnym spôsobom bez potreby vedieť HTML, CSS alebo JavaScript (hoci znalosť týchto technológií rozširuje flexibilitu, ktorú Shiny ponúka).

Shiny vs PowerBI (a iné nástroje)

Pomenujme najskôr “slona v miestnosti”. Je Shiny ten najlepší nástroj? Nie, nie je. Pre väčšinu prípadov si bohato vystačíte s Excelom a PowerBI (alebo Tableau či inými alternatívami, ale keďže mám bohaté skúsenosti s PowerBI, budem ho uvádzať ako príklad). Tieto nástroje sú nenáročné na používanie, ich „learning curve“ je ľahko zvládnuteľná na bežnej používateľskej úrovni a väčšinou sa jednoducho integrujú do spoločnosti. Poskytujú tiež dostatočnú flexibilitu, najmä MS produkty vďaka Power Query a jazyku DAX.

Prečo teda použiť Shiny? Odpoveď je jednoduchá: kedykoľvek vytvárate pokročilejšiu analytiku v R, bude jednoduchšie ju dať do produkcie natívnym nástrojom, ktorý nijakým spôsobom neobmedzuje funkcionalitu. Áno, PowerBI umožňuje použitie R a Pythonu, ale existujú obmedzenia na počet záznamov, ktoré môžete spracovať (150 000 riadkov je naozaj málo), podpora knižníc je obmedzená a vizualizácie sú statické obrázky.

Ďalším dôvodom na použitie Shiny môžu byť špecifické požiadavky na dizajn. Vďaka HTML, CSS a JavaScriptu máte prakticky neobmedzené možnosti. Rovnako máte viacero možností, kde si aplikáciu budete hostovať, čo zvyšuje flexibilitu pri nasadení v rôznych prostrediach.

Okrem toho, Shiny v kombinácii s frameworkami ako Golem alebo Rhino, poskytuje silné nástroje pre Continuous Integration/Continuous Deployment (CI/CD) vďaka integrácii s Gitom. Toto umožňuje automatizovaný a kontrolovaný proces vývoja, testovania a nasadzovania aplikácií, čo je obzvlášť užitočné v tímoch alebo pri práci na väčších projektoch. Takýto prístup zvyšuje kvalitu kódu, zrýchľuje vývoj a umožňuje rýchlejšie reagovať na zmeny a požiadavky.

Pre zosumarizovanie:

Výhody Shiny:

  • Flexibilita: Umožňuje používať celú silu R, vrátane knižníc a vlastných skriptov.
  • Open-source: Bezplatný a komunitou podporovaný nástroj.
  • Jednoduché rozšírenie: Možnosť integrácie s ďalšími nástrojmi a technológiami.
  • Výkon: Dokáže spracovať veľké množstvo dát.

Nevýhody Shiny:

  • Optimalizácia: Je nutná optimalizácia skriptov a modulov, aby užívateľ zbytočne nečakal pri dlho bežiacich výpočtoch.
  • Náročnosť: Vyžaduje znalosti R a programovania.

Výhody tradičných nástrojov:

  • Jednoduchosť použitia: Intuitívne rozhranie vhodné pre neprogramátorov.
  • Výkon: Optimalizované pre rýchle spracovanie veľkých dát.

Nevýhody tradičných nástrojov:

  • Náklady: Licenčné poplatky môžu byť vysoké.
  • Obmedzená flexibilita: Menej možností pre pokročilé analýzy a customizáciu oproti Shiny.
  • Výkon: Aj keď je PowerBI optimalizovaný pre veľké dáta, pri nesprávnej práci s ETL v Power Query a zle napísaných DAX funkciách môže výkon výrazne klesnúť, čo môže spôsobiť pomalé načítavanie a spracovanie dát.

“Vanilla” Shiny vs špecializované frameworky

Pri vývoji aplikácií v Shiny máte na výber medzi tzv. “vanilla” Shiny a špecializovanými frameworkami, ako sú Golem a Rhino. Každá možnosť má svoje výhody a nevýhody, ktoré by ste mali zvážiť v závislosti od vašich projektových potrieb.

“Vanilla” Shiny

“Vanilla” Shiny je základná verzia Shiny frameworku, ktorú väčšina používateľov začína používať. Je rýchly na nasadenie a umožňuje rýchle vytváranie prototypov a jednoduchých aplikácií. Táto verzia je ideálna pre menšie projekty alebo pre rýchle vytvorenie funkčného prototypu ako proof of concept.

Výhody:

  • Jednoduchosť a rýchlosť nasadenia.
  • Skvelé pre začínajúcich používateľov alebo menšie projekty.
  • Žiadna dodatočná záťaž z používania frameworkov, priamočiary kód.

Nevýhody:

  • Menej vhodné pre veľké a komplexné aplikácie.
  • Môže byť ťažké udržať čistý a organizovaný kód pri rozrastaní aplikácie.
  • Nedostatok robustných nástrojov na správu veľkých projektov, ako sú moduly, testovanie a CI/CD.

Golem

Golem je špecializovaný framework, navrhnutý pre vývoj robustných a produkčných Shiny aplikácií. Poskytuje silnú štruktúru pre váš projekt a podporuje modulárny prístup k vývoju, čo umožňuje lepšiu organizáciu a škálovateľnosť aplikácie. Výsledný projekt je zabalený ako R knižnica, čo prináša niekoľko výhod, vrátane jednoduchšej správy závislostí, opätovnej použiteľnosti kódu a jednoduchého nasadzovania. Benefitom je tiež kniha Engineering Production-Grade Shiny Apps od autorov Golemu.

Výhody:

  • Robustná štruktúra projektu, ktorá podporuje modularizáciu kódu.
  • Výsledok vo forme R knižnice, čo zjednodušuje správu a opätovné použitie kódu.
  • Umožňuje lepšiu správu veľkých a komplexných aplikácií.
  • Obsahuje nástroje na testovanie, nasadzovanie a CI/CD procesy.

Nevýhody:

  • Strmšia “learning curve” v porovnaní s “vanilla” Shiny.
  • Vyžaduje viac počiatočného nastavenia a organizácie.

Rhino

Rhino je moderný framework od spoločnosti Appsilon pre Shiny aplikácie, zameraný na väčšie projekty a kolaboráciu v tíme. Je postavený na princípoch moderného vývoja softvéru, vrátane automatizovaného testovania a CI/CD, čo ho robí ideálnym pre vývoj v prostrediach, kde sú požiadavky na kvalitu a škálovateľnosť vysoké. Rhino je navyše aktívne vo vývoji a pripravuje sa aj verzia pre Python, čo prináša sľubné rozšírenie možností pre používateľov preferujúcich Python.

Výhody:

  • Integrácia s modernými vývojovými nástrojmi a postupmi.
  • Flexibilná štruktúra, ktorá umožňuje pokročilú customizáciu a integráciu s front-end technológiami.
  • Silná podpora pre tímovú prácu a verziovanie kódu.
  • Aktívny vývoj, vrátane pripravovanej podpory pre Python.

Nevýhody:

  • Vyššia komplexnosť a náročnosť na vývoj v porovnaní s “vanilla” Shiny.
  • Vyžaduje znalosť moderných vývojárskych nástrojov a postupov.

Možnosti deploymentu

Po vytvorení Shiny aplikácie prichádza na rad jej nasadenie (deployment), aby bola dostupná pre koncových užívateľov. Existuje niekoľko možností, ako Shiny aplikáciu nasadiť, pričom každá z nich má svoje výhody a nevýhody.

Shinyapps.io

Najjednoduchší spôsob nasadenia je prostredníctvom shinyapps.io, ktorý je možný na pár kliknutí priamo cez RStudio IDE. Tento hostingový servis od Posit umožňuje rýchle a jednoduché nasadenie aplikácie.

Výhody:

  • Jednoduchosť nasadenia: Nasadenie aplikácie je možné vykonať na pár kliknutí priamo z RStudio.
  • Bez nutnosti infraštruktúry: Nemusíte sa starať o servery, firewall ani hardvér – všetko je spravované v cloude.
  • Free tier: Umožňuje hosťovať až 5 aplikácií zdarma, čo je výhodné pre menšie projekty alebo testovanie.

Nevýhody:

  • Výkon: Vo free verzii môže byť výkon aplikácie pomalší, čo sa prejavuje najmä pri vyššej záťaži alebo zložitých aplikáciách.
  • Zabezpečenie: Shinyapps.io ponúka základné možnosti autentifikácie, ale pokročilé zabezpečenie a kontrolu prístupu je obmedzené.
  • Zdieľaná platforma: Aplikácie bežia na zdieľanej infraštruktúre, čo môže mať vplyv na spoľahlivosť a výkon v prípade veľkého počtu používateľov.

Posit Connect

Posit Connect je profesionálna platforma pre nasadenie Shiny aplikácií a iných dátových produktov (napr. R Markdown, Plumber API, Python aplikácie), ktorá je navrhnutá pre podnikové prostredia. Poskytuje pokročilé možnosti nasadzovania, správu prístupov a monitorovanie aplikácií.

Výhody:

  • Široká podpora obsahu: Podporuje rôzne typy obsahu vrátane Shiny aplikácií, R Markdown reportov, Python skriptov a viac.
  • Bezpečnosť: Umožňuje pokročilé možnosti autentifikácie a kontroly prístupu, čím poskytuje lepšie zabezpečenie dát.
  • Škálovateľnosť: Podpora pre škálovanie aplikácií a správu veľkého počtu používateľov a prístupových práv.
  • Zjednodušené nasadenie: Možnosť nasadenia aplikácií cez push-button alebo pomocou Git.
  • Monitoring a správa: Poskytuje nástroje na sledovanie výkonu aplikácií a správu servera za účelom optimalizácie prevádzky.

Nevýhody:

  • Náklady: Posit Connect je platená služba, čo môže byť finančne náročné pre menšie tímy alebo jednotlivcov.
  • Komplexnosť: Vyžaduje infraštruktúru a určité technické znalosti pre správu a údržbu.

Docker + Cloud služby (GCP, AWS, Azure)

Pre pokročilejších používateľov je možné nasadiť Shiny aplikáciu pomocou Dockeru a cloudových služieb ako Google Cloud Platform (GCP), Amazon Web Services (AWS) alebo Microsoft Azure.

Výhody:

  • Flexibilita: Možnosť nasadiť aplikáciu na rôzne cloudové platformy podľa preferencií.
  • Škálovateľnosť: Vysoká škálovateľnosť a možnosť spravovať zdroje podľa aktuálnych potrieb.
  • Kontrola: Úplná kontrola nad infraštruktúrou a konfiguráciou prostredia.

Nevýhody:

  • Komplexnosť: Vyžaduje pokročilé technické znalosti na konfiguráciu Dockeru a cloudových služieb.
  • Náklady: Prevádzka v cloude môže byť nákladná, najmä pri nesprávnej konfigurácii zdrojov.

Docker + Lokálny RStudio Server

Nasadenie Shiny aplikácie pomocou Dockeru a lokálneho RStudio Servera je ďalšou možnosťou pre tímy, ktoré chcú mať úplnú kontrolu nad svojou infraštruktúrou.

Výhody:

  • Kontrola: Úplná kontrola nad prostredím a konfiguráciou servera.
  • Izolácia: Docker poskytuje izolované prostredie pre aplikácie, čo zlepšuje bezpečnosť a stabilitu.
  • Nákladová efektívnosť: Ak už máte existujúcu infraštruktúru, náklady môžu byť nižšie v porovnaní s cloudovými službami.

Nevýhody:

  • Komplexnosť: Vyžaduje správu a údržbu vlastnej infraštruktúry, čo môže byť náročné na čas, financie a technické zdroje.
  • Obmedzená škálovateľnosť: Lokálna infraštruktúra môže byť limitovaná dostupnými zdrojmi.

Príkladová Shiny Aplikácia

Táto príkladová Shiny aplikácia bola vytvorená pomocou frameworku Rhino a predstavuje posledný krok v rámci projektu, ktorý začal získavaním dát pomocou web scrapingu, spracovaním dát, a následne tvorbou predikčného modelu. Celý projekt bol zdokumentovaný v sérii článkov:

Aplikácia umožňuje používateľom preskúmať a vizualizovať tieto dáta. Ako hlavný benefit, ktorý demonštruje výhody použitia Shiny (okrem custom dizajnu), je integrácia predikčného modelu. Používatelia môžu zadať parametre bytu a aplikácia im poskytne odhadovanú cenu, čo je praktický príklad využitia pokročilej analytiky a interaktívnych možností Shiny.

Aplikáciu si môžete vyskúšať na shinyapps.io alebo ako kontajnerizovanú aplikáciu na Google Cloud Platform (GCP).