Programovanie

Premeňte dokument R Markdown na interaktívny zážitok

R Markdown je jednou z mojich najobľúbenejších vecí na modernom R. Ponúka jednoduchý spôsob, ako spojiť text, R kód a výsledky R kódu do jedného dokumentu. A keď je tento dokument vykreslený ako HTML, môžete pridať nejaké interakcie používateľa s widgetmi HTML, ako je DT pre tabuľky alebo leták pre mapy. (Ak nie ste oboznámení s programom R Markdown, môžete si najskôr pozrieť môj videonávod R Markdown a potom sa sem vrátiť.)

Možno však neviete, že existuje spôsob, ako ešte viac vylepšiť interaktivitu R Markdown: pridaním runtime: lesklý do hlavičky dokumentu.

Shiny je rámec webových aplikácií pre R. Ako rámec má dosť špecifickú štruktúru. Dokument R Markdown však môžete previesť do aplikácie Shiny bez toho, aby ste museli dodržiavať veľa tuhej štruktúry. Namiesto toho môžete skočiť priamo do programu a začať s programovaním - bez obáv z typických lesklých úloh, ako je zabezpečenie správnosti všetkých zátvoriek a čiarok v rámci hlboko vnorených funkcií rozloženia.

V skutočnosti, aj keď ste skúseným lesklým vývojárom, môže byť dokument R Markdown stále užitočný pre lesklé úlohy, kde nepotrebujete plnohodnotnú aplikáciu, alebo na rýchle vyskúšanie kódu. Stále bude potrebovať Lesklý server, ale ak máte nainštalované RStudio a lesklý balík, jeden z nich už lokálne máte.

Poďme sa pozrieť na to, ako funguje runtime lesklý v aplikácii R Markdown.

1. Základné R Markdown

Začnem konvenčným dokumentom R Markdown, ktorý nie je lesklý a ktorý obsahuje prehľadateľnú tabuľku údajov podľa PSČ Massachusetts. Používatelia môžu vyhľadávať alebo triediť podľa ľubovoľných stĺpcov tabuľky a odpovedať na otázky typu „Ktoré PSČ majú najvyšší stredný príjem domácnosti Middlesex County?“ alebo „Aké poštové smerovacie čísla majú najpriaznivejšie mesačné bývanie?“

Sharon Machlis /

Tento dokument má aj histogram, ktorý zobrazuje rozdelenie stredných príjmov domácnosti a text uvádzajúci, ktoré PSČ majú najvyšší a najnižší príjem. Tabuľka je interaktívna, zvyšok dokumentu však nie. Vykreslenú verziu HTML môžete vidieť na RPubs programu RStudio.

Ak by ste chceli pokračovať, môžete si na GitHub pozrieť kód samostatnej verzie tohto dokumentu R Markdown - vrátane údajov. Alebo ak chcete zistiť, ako som získal tieto demografické údaje do jazyka R, v tomto článku je uvedený kód R na vytvorenie vlastnej množiny údajov (a vyladením kódu môžete zvoliť iný stav). Ak vytvoríte svoju vlastnú verziu údajov, kód pre základný dokument R Markdown pomocou samostatného údajového súboru je tiež na GitHub.

Bez ohľadu na to, aký dokument R Markdown si vyberiete, uvidíte, že je to väčšinou statický dokument s určitou interaktivitou. Ale čo keď by sa mi páčilo celý dokument byť interaktívny - v takom prípade vidíte zmeny histogramu a textu, ako aj tabuľku? Ako môže byť používateľ schopný zvoliť jednotlivé mestá a vidieť všetko informácie filtrované tak, aby sa zobrazili iba pre tieto miesta?

Jedným z riešení je vygenerovať stránku pre každé mesto - možné pomocou skriptu R. Ak používate takzvané parametrizované prehľady. Môžete však tiež vytvoriť jeden dokument R Markdown, ktorý funguje ako interaktívna aplikácia.

Pridajte lesklú interaktivitu

Ak chcete pridať lesklú interaktivitu do bežného dokumentu R Markdown, začnite pridaním runtime: lesklý do hlavičky YAML dokumentu, napríklad:

---

názov: „Priemerný príjem domácnosti podľa PSČ“

výstup: html_document

runtime: lesklý

---

Akonáhle to urobíte a stlačte Uložiť, ikona úpletu v RStudiu sa zmení na „Spustiť dokument“. Aj keď výstup stále hovorí „html_document“, už to nebude obyčajný HTML. Teraz je to mini-lesklá aplikácia.

Sharon Machlis / Sharon Machlis,

Umožnite používateľom vyberať údaje

Teraz potrebujem spôsob, ako môžu používatelia vykonávať svoje voľby údajov. Shiny má na to množstvo „vstupných widgetov“. Použijem selectInput (), ktorý vytvára rozbaľovací zoznam a umožňuje používateľom vybrať si viac ako jednu položku. Shiny má ďalšie widgety pre prepínače, zadávanie textu, selektory dátumu a ďalšie. Ich zbierku si môžete pozrieť v Galérii lesklých widgetov RStudio.

Kód pre moju miniaplikáciu selectInput () rozbaľovací zoznam má päť argumentov a vyzerá takto:

selectInput ("mycities", "Vyberte 1 alebo viac miest:",

voľby = zoradiť (jedinečné (markdowndata $ City)),

selected = "Boston", multiple = TRUE)

Prvý argument preselectInput (), mycity je názov premennej, ktorú som si vybral na uloženie všetkých hodnôt, ktoré užívateľ vyberie. Druhým argumentom je text hlavičky, ktorý sa zobrazí v rozbaľovacom zozname. Tretí argument, možnosti, je vektor všetkých možných hodnôt v rozbaľovacom zozname - v tomto prípade jedinečné hodnoty názvov miest v mojich údajoch, zoradené podľa abecedy. vybrané = Boston Znamená, že rozbaľovacia ponuka bude predvolene vybraným mestom Boston (výber predvoleného výberu je voliteľný). A nakoniec, násobok = PRAVDA umožňuje používateľom zvoliť si viac ako jedno mesto súčasne.

Tento kód vytvára rozbaľovací zoznam HTML. Ak to spustíte selectInput () kód vo vašej konzole R, vygeneruje HTML pre rozbaľovaciu ponuku (za predpokladu, že máte načítaný Shiny a dátový rámec s názvom markdowndata so stĺpcom City).

Ďalej musím napísať nejaké R, aby táto rozbaľovacia ponuka skutočne niečo urobila.

Vytvorte dynamické premenné

Túto logiku interaktivity kódujem do dvoch častí:

  1. Vytvorte dátový rámec - budem to nazývať mydata—To sa filtruje zakaždým, keď si používateľ vyberie mesto.
  2. Napíšte kód pre text, histogram a údajovú tabuľku, ktoré sa budú meniť na základe môjho dynamického dátového rámca.

Najdôležitejšie je mať na pamäti, že tieto objekty už nie sú „bežnými“ R premennými. Sú dynamický. Oni zmena na základe akcií používateľa. To znamená, že fungujú trochu inak ako premenné, na ktoré ste pravdepodobne zvyknutí.

Čo je na nich zvláštne? Tu sú tri veci, ktoré potrebujete vedieť:

  1. Ak chcete získať prístup k hodnote vstupnej premennej, ktorá uchováva informácie od vášho používateľa, potrebujete syntax zadajte $ myvarname, nielen jednoducho myvarname. Takže pre hodnoty uložené v mycity rozbaľovací zoznam, použite vstup $ mycities
  2. Objekty ako grafy a tabuľky, ktoré závisia od hodnôt od vášho používateľa, sú tiež dynamické a musia byť reaktívne. Je to také ľahké ako zabaliť ich do špeciálnej funkcie, ale musíte si to uvedomiť. Tiež k nim nie je možné získať prístup iba pomocou ich mien, ale vyžadujú sa tiež zátvorky: syntax ako myvar () a nie myvar.
  3. Keď tydisplej dynamický obsah - opäť veci ako tabuľka, mapa, histogram alebo dokonca text - je potrebné ho vykresliť špeciálnym spôsobom, zvyčajne pomocou jednej zo špeciálnych funkcií vykreslenia Shiny. Dobrá správa je, že Shiny sa stará o väčšinu funkcií monitorovania zmien a výpočtu výsledkov. Musíte len vedieť, ktorú funkciu máte použiť, a potom ju zahrnúť do svojho kódu.

To je často jednoduchšie, ako by to mohlo znieť. Tu je príklad, ako by som vytvoril dátový rámec s názvom mydata ktoré sa menia zakaždým, keď si užívateľ vyberie mesto pomocou značky mycities selectInput () rozbaľovacia ponuka:

mydata <- reaktívne ({

filter (markdowndata, Mesto% v% vstup $ mycities)

})

The mydata objekt teraz obsahuje a reaktívny výraza zmení hodnotu zakaždým, keď používateľ urobí zmenu v ovládacom zozname mycity.

Zobraziť dynamické premenné

Teraz by som chcel kódovať tabuľku použitím že filtrované mydata údaje.

Ako ste už asi uhádli, DT :: datatable (mydata) nebude fungovať. A existujú dva dôvody prečo.

Najskôr preto mydata je reaktívny výraz, nemôžete ho pomenovať iba menom. Potrebuje po ňom zátvorky, ako naprmydata ().

Ale po druhé,DT :: datatable (mydata ()) nebude fungovať ani ako samostatný kód. Zobrazí sa chybové hlásenie podobné tomuto:

 Prevádzka nie je povolená bez aktívneho reaktívneho kontextu.

(Pokúsili ste sa urobiť niečo, čo sa dá urobiť iba zvnútra

reaktívny výraz alebo pozorovateľ.)

Verzie tohto chybového hlásenia sa môžu pomerne často zobraziť, keď začínate. Znamená to, že sa snažíte zobraziť niečo dynamické pomocou konvenčnej syntaxe R.

Aby som to napravil, potrebujem Lesklý funkcia vykreslenia. Niekoľko vizualizačných balíkov má svoje vlastné špeciálne funkcie vykreslenia Shiny, vrátane DT. Jeho funkcia vykreslenia je renderDT (). Ak pridám renderDT ({}) okolo kódu DT a znovu spustiť dokument, to by malo fungovať.

Toto je môj tabuľkový kód:

renderDT ({

DT :: datatable (mydata (), filter = 'top')%>%

formatCurrency (4: 5, digits = 0)%>%

formatCurrency (6, currency = "", digits = 0)

})

Poznámka: Okrem vytvorenia a zobrazenia tabuľky tento kód pridáva aj určité formátovanie. Stĺpce 4 a 5 sa zobrazujú ako mena so znakom dolára a čiarkami. Druhy formatCurrency () riadok pre stĺpec 6 pridá čiarky k zaobleným číslam bez znaku dolára, pretože som ako symbol meny uviedol „“.

Môžem použiť to isté mydata () reaktívny dátový rámec na vytvorenie histogramu pomocou inej funkcie Shiny render: renderPlot ().

renderPlot ({

ggplot2 :: ggplot (mydata (), aes (x = MedianHouseholdIncome)) +

geom_histogram (binwidth = 20000, color = "black", fill = "darkgreen") +

theme_classic () +

xlab ("") +

ylab ("") +

scale_x_continuous (štítky = dolár)

})

Tento kód obsahuje aj malý štýl ggplot, ako je výber farieb pre obrys pruhu a výplň a zmena témy grafu. Posledný riadok naformátuje os x tak, aby pridával znaky dolára a čiarky, a vyžaduje balíček váh.

Každý z týchto blokov kódu R musí byť v rámci bloku kódu R Markdown, rovnako ako akékoľvek iné bloky kódu R v konvenčnom dokumente Markdown. Môže to vyzerať napríklad ako kód uvedený nižšie, ktorý tiež pomenuje časť súboru „histo“ (názvy sú voliteľné) a nastaví šírku a výšku môjho pozemku v palcoch.

„{r histo, fig.width = 3, fig.height = 2}

renderPlot ({

ggplot2 :: ggplot (mydata (), aes (x = MedianHouseholdIncome)) +

geom_histogram (binwidth = 20000, color = "black", fill = "darkgreen") +

theme_classic () +

xlab ("") +

ylab ("") +

scale_x_continuous (štítky = dolár)

})

```

Ak by som chcel zobraziť interaktívny text, ktorý sa mení podľa výberu používateľa, potrebujem funkciu Lesklé vykreslenie s názvom — prekvapenie! -renderText (). Môžete to vložiť do bloku kódu alebo môžete použiť alternatívny formát syntaxe R Markdown mimo blokov kódu, ako je tento:

Mám nejaký obyčajný text a potom pridám `r R KÓD BUDE HODNOTENÝ TU`

Syntax pre toto je jeden spätný klik, za ktorým okamžite nasleduje malé písmeno r, medzera, kód R, ktorý chcete vyhodnotiť, a končiaci ďalším samostatným spätným tlačidlom. Ak chcete teda do histogramu pridať dynamický nadpis, môžete použiť tento kód:

Histogram pre `r renderText ({vstup $ mycities})`

Pre jedno mesto to funguje dobre. Ak je však viac ako jedno mesto, tento kód iba zobrazí názvy bez čiarok medzi nimi, ako napr Boston Cambridge Amherst. Pokiaľ ide o verejne prístupný kód, chceli by ste to trochu vylepšiť, možno pomocou základných R. vložiť () funkcia:

Histogram pre `r renderText ({paste (zadajte $ mycities,

sep = "", collaps = ",")}) `

Podobný kód môžete použiť na generovanie textu, ktorý informuje používateľov o PSČ s najvyšším a najnižším stredným príjmom. Pre tieto výpočty som vytvoril jeden reaktívny dátový rámec obsahujúci riadok s najvyšším príjmom domácnosti a druhý s najnižším.

Tiež som zistil, že najnižší stredný príjem bol podozrivo nízky - 2 500 dolárov v univerzitnej komunite v Amherste v Massachusetts - kde priemerné mesačné náklady na bývanie sú 1 215 dolárov. Myslím, že to je koncentrácia študentského bývania, takže som vylúčil akékoľvek PSČ s mediánom príjmu domácnosti nižším ako 5 000 dolárov.

Tu je kód na vytvorenie týchto dvoch dátových rámcov:

zip_highest_income_row <- reaktívny ({

filter (mydata (), MedianHouseholdIncome == max (MedianHouseholdIncome, na.rm = TRUE))

})

zip_lowest_income_row <- reaktívny ({

filter (mydata (), MedianHouseholdIncome> = 5000)%>%

filter (MedianHouseholdIncome == min (MedianHouseholdIncome, na.rm = PRAVDA))

})

Toto by malo vyzerať ako typické dplyr filter () kód, až na to, že 1) každý je zabalený do a reaktívny ({}) funkcie a 2) mydata dynamický dátový rámec, ktorý sa mení na základe vstupu používateľa, sa označuje ako mydata () a nie jednoducho mydata

Ak chcete zobraziť hodnotu prvej položky v zip_highest_income_row stĺpec ZIP dátového rámca, nemôžem použiť obvyklý R kódzip_highest_income_row $ Zip [1]. Namiesto toho sa musím odvolať na dynamický dátový rámec so zátvorkami:zip_highest_income_row () $ Zip [1] . A potom to zabaľte do Lesklej render () funkcia — v tomto prípade renderText ():

PSČ `r renderText (zip_highest_income_row () $ ZipCode [1])` v

`r renderText (zip_highest_income_row () $ Mesto [1])`

má najvyšší stredný príjem na miestach, ktoré ste vybrali,

`r renderText (váhy :: dolár (zip_highest_income_row () $ MedianHouseholdIncome [1]))`.

PSČ `r renderText (zip_lowest_income_row () $ ZipCode [1])` v

`r renderText (zip_lowest_income_row () $ City [1])` má najnižší

stredný príjem na miestach, ktoré ste vybrali,

`r renderText (váhy :: dolár (zip_lowest_income_row () $ MedianHouseholdIncome [1]))`.

Spustite a zdieľajte svoju aplikáciu Shiny

Akonáhle pridáte runtime: lesklý na R Markdown, už to nie je súbor HTML - je to mini lesklá aplikácia. A to znamená, že na spustenie potrebuje lesklý server.

Ako som už spomínal, ktokoľvek s R, RStudio a lesklým balíkom má vo svojom lokálnom systéme lesklý server. Vďaka tomu je ľahké zdieľať akúkoľvek aplikáciu Shiny s ostatnými používateľmi R. Môžete im poslať dokument e-mailom alebo, elegantnejšie, zverejniť ich online ako súbor zazipovaný v archíve a použiť lesklý :: runUrl () príkaz. Existujú špeciálne runGitHub () a runGist () funkcie pre aplikácie na GitHube, ktoré sú pohodlné, ak používate GitHub pre projekty, ktoré automaticky komprimujú ďalšie súbory vo vašom projekte, napríklad dátové súbory.

Je však pravdepodobné, že v určitom okamihu budete chcieť ukázať svoju prácu používateľom, ktorí nepoužívajú R, a to si vyžaduje verejne prístupný Lesklý server. Asi najjednoduchšou možnosťou je služba shinyapps.io od RStudio. Je to zadarmo pre niekoľko obmedzených verejných aplikácií s veľmi ľahkým využitím. Cena platených účtov je založená na počte aktívnych hodín, ktoré pre vaše aplikácie ponúkajú. Aktívne hodiny merajú čas, ktorý sa aplikácia aktívne používa - jedna osoba zapnutá na hodinu je rovnaká ako 100 ľudí v danú hodinu. Aby ste zabezpečili nepretržitú prevádzku pre niekoľko aplikácií, potrebujete štandardný účet vo výške 1 100 USD ročne s 2 000 hodinami.

Môžete si tiež vytvoriť svoj vlastný server Shiny na cloudovej službe, ako je AWS a inštalácie pre R, a bezplatná verzia serverového softvéru RStudio Shiny. Existuje skvelý podrobný návod Deana Attaliho, ktorý ukazuje, ako to urobiť, v spoločnosti Digital Ocean, kde môžete vytvoriť a spustiť malý server Shiny za pouhých 5 dolárov mesačne za náklady na hosťovanie bez obáv z aktívnych hodín. Kompromisom je vykonávanie vašich vlastných opráv a aktualizácií R / knižnice - a pre robustné aplikácie budete možno potrebovať zdatnejší virtuálny server ako najlacnejšia kvapka 1G.

Pridajte interaktívnu mapu

Na záver vás prevediem tým, ako som do tohto dokumentu pomocou balíka letákov pridal interaktívnu mapu.

Najskôr potrebujete súbor s geopriestorovými aj číselnými údajmi, aby vaša aplikácia poznala tvar každého PSČ. Nasledujúci kód vysvetľuje, ako vytvoriť rámec priestorových údajov pomocou balíkov tidycensus a sf.

Pre interaktivitu vytvorím dynamickú verziu týchto priestorových údajov, takže na mape sa zobrazia iba vybrané mestá. Nižšie je uvedený môj kód. Môže to vyzerať trochu opakujúco, ale namiesto stručnosti idem na čitateľnosť. Pokojne dotiahnite svoju vlastnú verziu.

mapdata <- reaktívne ({

if („Celá hmotnosť“% v% vstupe $ mycities) {

ma_appdata_for_map%>%

dplyr :: select (ZipCode = GEOID, MedianHouseholdIncome = medincome, MedianMonthlyHousingCost = medmonthlyhousingcost, populácia = pop, mesto, kraj = názov kraja, štát, zemepisná šírka, dĺžka, príjem, bývanie, pop, geometria)%>%

mutovať(

Zvýraznené = "Áno"

) %>%

sf :: st_as_sf ()

} else {

dplyr :: filter (ma_appdata_for_map, mesto% v% vstup $ mycities)%>%

dplyr :: select (ZipCode = GEOID, MedianHouseholdIncome = medincome, MedianMonthlyHousingCost = medmonthlyhousingcost, populácia = pop, mesto, kraj = názov kraja, štát, zemepisná šírka, dĺžka, príjem, bývanie, pop, geometria)%>%

dplyr :: mutovať (

Zvýraznené = ifelse (Mesto% v% vstupov $ mycities, "Áno", "Nie")

) %>%

sf :: st_as_sf ()

}

})

Reaktívna funkcia by už mala byť známa. Môj ak a inak vyhlásenia berú do úvahy, či si používateľ vybral možnosť All Mass alebo iba jednotlivé mestá. Ak vyberiem inú možnosť ako All Mass, filtrujem iba vybrané mestá. V obidvoch prípadoch používam konvenčné dplyr select () Funkcia výberu stĺpcov, ktoré chcem na mape umiestniť, nezabudnite zahrnúť zemepisnú šírku, dlhú zemepisnú dĺžku a geometriu, ktorá obsahuje súbory s tvarom polygónu PSČ. Posledný riadok v každej ak () sekcia kódu zaisťuje, aby výsledky boli geopriestorovým objektom sf (jednoduché funkcie). Aj keď som tento kód nepotreboval na svojom lokálnom počítači Mac, aplikácia som pri zahrnutí fungoval lepšie na shinyapps.io.

Teraz je čas pracovať na farbách mapy. Pre svoju mapu letákov nastavím dve reaktívne palety farieb, jednu pre príjem a druhú pre náklady na bývanie. V obidvoch prípadoch používam zelenú farbu, ale môžete si vybrať ľubovoľnú.

neúplný <- reaktívny ({

leták :: colorNumeric (paleta = "Zelení",

doména = mapdata () $ MedianHouseholdIncome)

})

Housingpal <- reaktívny ({

leták :: colorNumeric (paleta = "Zelení",

doména = mapdata () $ MedianMonthlyHousingCost)

})

Chcem, aby boli tiež reaktívne, takže sa menia na základe výberu používateľov. Argument doména definuje hodnoty, ktoré bude paleta zobrazovať. V prvom prípade je to stĺpec MedianHouseholdIncome môjho reaktívneho objektu mapdata - s mapovými údajmi kódovanými ako mapdata () pretože je reaktívny; v druhom prípade je to stĺpec MedianMonthlyHousingCost.

Tiež nastavím presne to, ako chcem, aby sa zobrazoval môj vyskakovací text. Môže to obsahovať zmes kódu HTML (

je zlom riadku HTML) a stĺpce dátového rámca. Aj keď určite môžete použiť základňu R. vložiť () alebo paste0 () funkcií, balíček lepidla sa mi zdá oveľa ľahší, keď pracujem s viac ako jednou premennou zmiešanou s textom. Nižšie vidíte, že do zložených zátvoriek musím len priložiť premenné, ktoré chcem vyhodnotiť. Samozrejme, aj vyskakovací text musí byť reaktívny, takže sa tiež mení výberom používateľa.

mypopups <- reaktívne ({

lepidlo :: lepidlo („PSČ: {mapdata () $ ZipCode}

Stredný príjem domácnosti: {mapdata () $ income}

Stredné mesačné náklady na bývanie: {mapdata () $ Housing}

Počet obyvateľov: {mapdata () $ Pop}

Mesto: {mapdata () $ City}

Kraj: {mapdata () $ County} ")

})

Na záver kód pre samotnú mapu letáku.

leták :: renderLeaflet ({

leták (mapdata ())%>%

addProviderTiles ("CartoDB.Positron")%>%

addPolygons (fillColor = ~ Incomepal () (mapdata () $ MedianHouseholdIncome),

fillOpacity = 0,7,

hmotnosť = 1,0,

farba = "čierna",

smoothFactor = 0,2,

vyskakovacie okno = mypopups (),

group = "Príjem domácnosti"

) %>%

addPolygons (fillColor = ~ housingpal () (mapdata () $ MedianMonthlyHousingCost),

fillOpacity = 0,7,

hmotnosť = 0,2,

farba = "čierna",

smoothFactor = 0,2,

vyskakovacie okno = mypopups (),

group = "Náklady na bývanie"

) %>%

addLayersControl (

baseGroups = c ("Príjem domácnosti", "Náklady na bývanie"),

position = "bottomleft",

options = layersControlOptions (zbalené = FALSE)

)

})

renderLeaflet () je funkcia Shiny render, ktorá zobrazí dynamický dataviz spoliehajúci sa na dynamický objekt mapdata. Vo vnútri tejto funkcie je „bežný“ kód na mapovanie letákov. Prvý riadok, leták (mapdata ()), vytvorí objekt letáku R. z reaktívneho objektu mapdata. Používa balíček letákov, ktorý je obalom R. do knižnice leaflet.js. Nasledujúci riadok pridáva štýl dlaždíc máp pozadia z CartoDB.

The addPolygons () funkcia informuje leták o tom, ako zobraziť polygóny PSČ. Chcem, aby to bolo zafarbené v stĺpci MideanHouseholdIncome pomocou palety príjmov, ktorú som nastavil skôr, neúplne. Väčšina zvyšných týchto argumentov je štylizovaná. The objaviť sa argument nastaví vyskakovací text na mypopups objekt, ktorý som vytvoril skôr, a argument group pomenuje vrstvu mapy.

Pridávam ďalšiu podobnú vrstvu pre stredné mesačné náklady na bývanie. A nakoniec addLayersControl () umiestni legendu, na ktorú je možné kliknúť, pre každú vrstvu vľavo dole.

Sharon Machlis /

Ak sa chcete dozvedieť viac informácií o mapovaní v jazyku R pomocou letáku, pozrite si môj návod „Vytváranie máp v jazyku R v 10 (pomerne) jednoduchých krokoch.“

Konečný súbor R markdown

Konečný súbor R Markdown si môžete pozrieť na GitHub. Ak sa dôkladne pozriete na kód, môžete si všimnúť niekoľko dodatkov. Celú omšu som pridal do selectInput () vektor na výber z rozbaľovacieho zoznamu, takže tento kód je teraz

selectInput ("mycities", "Vyberte 1 alebo viac miest:",

voľby = c ("Celá omša", zoradenie (jedinečné (markdowndata $ City))),

multiple = TRUE, selected = "Boston")

A potom som doladil niekoľko ďalších riadkov kódu, aby som dal inú možnosť, ak je vybratá možnosť All Mass, napríklad vytvorenie dynamickej premennej selected_places, ktorá povie „Massachusetts“, ak je „All Mass“ jedným z vybraných miest.

selected_places <- reactive ({

if („Celá hmotnosť“% v% vstupe $ mycities) {

„Massachusetts“

} else {

vložiť (zadajte $ mycities,

sep = "", kolaps = ",")

}

})

Všimnite si tiež novú hlavičku YAML:

---

názov: „Priemerný príjem domácnosti podľa PSČ“

výstup: html_document

súbory_zdrojov:

- mamarkdowndata.rdata

- zip_mass_appdata_for_map.rds

runtime: lesklý

---

Toresources_files: možnosť hovorí, že tento dokument vyžaduje na spustenie ďalšie dva súbory, mamarkdowndata.rdata a zip_mass_appdata_for_map.rds. Vďaka tomu môže server shinyapps.io vedieť, že tieto súbory je potrebné pri nasadení súboru s hlavným dokumentom R Markdown nahraťrsconnect :: deployDoc ("docname.Rmd").

Tento interaktívny dokument R Markdown s Shiny v akcii si môžete pozrieť na //idgrapps.shinyapps.io/runtimeshiny/. Načítanie môže chvíľu trvať, pretože som sa nepokúšal optimalizovať tento kód na rýchlosť. RStudio má nejaké zdroje, ak sa chcete dozvedieť o zrýchlení lesklých aplikácií.

Čím sa líši od „skutočnej“ aplikácie Shiny?

Tento super nabitý dokument Shiny R Markdown sa líši od plnohodnotnej aplikácie Shiny niekoľkými kľúčovými spôsobmi.

1. Lesklá aplikácia musí byť v jednom súbore s názvom app.R alebo v dvoch súboroch ui.R a server.R. Aplikácia môže zdroj ďalšie súbory s inými názvami, ale táto štruktúra názvov súborov je absolútna. V aplikácii s jedným súborom.R sú potrebné sekcie pre používateľské rozhranie (používateľské rozhranie, ktoré definuje, čo používateľ vidí a s čím interaguje) a server.

2. Lesklé rozloženia aplikácií sú zostavené okolo rámca mriežky stránky Bootstrap. Viac informácií o štruktúre rozloženia nájdete v Sprievodcovi rozložením aplikácie Shiny aplikácie RStudio.

3. Najdynamickejšie komponenty, ktoré chcete vykresliť, vrátane vecí, ako sú grafy a tabuľky, musia byť konkrétne umiestnené niekde na stránke s ďalšími výstupnými funkciami a definíciami. Napríklad interaktívna mapa letákov by potrebovala kód ako napr leafletOutput ("mymap") niekde v ui povedať aplikácii, kde sa má zobraziť, okrem kódu servera ako napr

výstup $ mymap <- renderLeaflet ({#MAP CODE HERE})

definovať logiku generujúcu mapu.

Tu je príklad súboru Shiny app.R pre histogram a tabuľku tejto aplikácie:

knižnica („lesklá“)

knižnica ("dplyr")

knižnica ("ggplot2")

knižnica („DT“)

možnosti (scipen = 999)

load ("mamarkdowndata.rdata") # načíta premennú markdowndata

ma_appdata_for_map <- readRDS ("zip_mass_appdata_for_map.rds")

# Definujte používateľské rozhranie

ui <- fluidPage (

# Názov aplikácie

titlePanel („Príjmy a náklady na bývanie podľa PSČ“),

# Bočný panel

rozloženie na bočnom paneli (

bočný panelPanel (

selectInput ("mycities", "Choose 1 or more Massachusetts places:", choices = c ("All Mass", sort (unique (markdowndata $ City))), multiple = TRUE, selected = "Boston"),

br (),

silný ("Poznámka: niektoré mestá môžu mať pre poštové smerovacie čísla viac ako jedno miestne meno. Napríklad Allston, Brighton, Dorchester a niekoľko ďalších štvrtí nie sú súčasťou PSČ podľa miestneho názvu \" Boston \ ".))

),

# Zobraziť histogram

mainPanel (

h4 (htmlOutput ("histogramHeadline")),

plotOutput ("myhistogram"),

br (),

h4 (htmlOutput ("tableHeadline")),

DTOutput ("mytable")

)

)

)

# Definujte logiku servera potrebnú na nakreslenie histogramu

server <- funkcia (vstup, výstup) {

mydata <- reaktívne ({

if („Celá hmotnosť“% v% vstupe $ mycities) {

markdowndata

} else {

filter (markdowndata, Mesto% v% vstup $ mycities)

}

})

selected_places <- reactive ({

if („Celá hmotnosť“% v% vstupe $ mycities) {

„Massachusetts“

} else {

vložiť (zadajte $ mycities,

sep = "", kolaps = ",")

}

})

výstup $ histogramHeadline <- renderUI ({

paste ("Histogram pre", selected_places (), "údaje o príjmoch")

})

výstup $ tableHeadline <- renderUI ({

paste ("Údaje pre", selected_places ())

})

výstup $ myhistogram <- renderPlot ({

ggplot (mydata (), aes (x = MedianHouseholdIncome)) +

geom_histogram (binwidth = 20000, color = "black", fill = "darkgreen") +

theme_classic () +

xlab ("") +

ylab ("") +

scale_x_continuous (štítky = dolár)

})

výstup $ mytable <- renderDT ({

DT :: datatable (mydata (), filter = 'top')%>%

formatCurrency (4: 5, digits = 0)%>%

formatCurrency (6, currency = "", digits = 0)

})

}

# Spustite aplikáciu

shinyApp (ui = ui, server = server)

Viac informácií o vytváraní týchto druhov aplikácií Shiny sa dozviete v úvodných tutoriáloch Shtiny od RStudio.

Ďalšie tipy R nájdete na stránke videa Zvládnite viac s R alebo v zozname videí Zvládnite viac s R na YouTube.

$config[zx-auto] not found$config[zx-overlay] not found