Programování

Proměňte dokument R Markdown na interaktivní zážitek

R Markdown je jedna z mých oblíbených věcí na moderním R. Nabízí snadný způsob, jak kombinovat text, R kód a výsledky R kódu v jediném dokumentu. A když je tento dokument vykreslen jako HTML, můžete přidat nějakou interakci uživatele s widgety HTML, jako je DT pro tabulky nebo leták pro mapy. (Pokud nejste obeznámeni s programem R Markdown, můžete si nejprve prohlédnout můj videonávod R Markdown a poté se sem vrátit.)

Možná ale nevíte, že existuje způsob, jak ještě více vylepšit interaktivitu R Markdown: přidáním runtime: lesklý do záhlaví dokumentu.

Shiny je rámec webových aplikací pro R. Jako rámec má poměrně specifickou strukturu. Dokument R Markdown však můžete převést na lesklou aplikaci aniž byste museli sledovat tu tuhou strukturu. Místo toho můžete skočit přímo a začít programovat - aniž byste se museli starat o některé typické lesklé úkoly, jako je zajištění správnosti všech závorek a čárek v hluboce vnořených funkcích rozložení.

Ve skutečnosti, i když jste zkušeným lesklým vývojářem, může být dokument R Markdown stále užitečný pro lesklé úkoly, kde nepotřebujete plnohodnotnou aplikaci nebo pro rychlé vyzkoušení kódu. Stále bude potřebovat lesklý server, ale pokud máte nainstalované RStudio a lesklý balíček, jeden z nich již máte lokálně.

Pojďme se podívat na to, jak runtime shiny funguje v R Markdown.

1. Základní R Markdown

Začnu konvenčním, nelesklým dokumentem R Markdown, který obsahuje prohledávatelnou tabulku dat podle PSČ Massachusetts. Uživatelé mohou vyhledávat nebo třídit podle libovolného sloupce tabulky a odpovídat na otázky typu „Které PSČ mají nejvyšší střední příjem domácnosti Middlesex County?“ nebo „Jaké poštovní směrovací čísla mají nejdražší měsíční bydlení?“

Sharon Machlis /

Tento dokument má také histogram zobrazující rozdělení středních příjmů domácností a text uvádějící, která PSČ mají nejvyšší a nejnižší příjmy. Tabulka je interaktivní, ale zbytek dokumentu není. Vykreslenou verzi HTML můžete vidět na RPubs RStudio.

Pokud byste chtěli pokračovat, můžete si zobrazit kód pro samostatnou verzi tohoto dokumentu R Markdown - včetně dat - na GitHubu. Nebo, pokud byste chtěli vidět, jak jsem dostal tato demografická data do R, je v tomto článku kód R pro vytvoření vaší vlastní datové sady (a můžete vyladit kód a vybrat jiný stav). Pokud vytvoříte vlastní verzi dat, kód pro základní dokument R Markdown pomocí samostatného datového souboru je také na GitHubu.

Ať už si vyberete jakýkoli dokument R Markdown, uvidíte, že je to převážně statický dokument s určitou interaktivitou. Ale co když bych chtěl celý dokument být interaktivní - v tomto případě vidíte histogram a změnu textu i tabulku? Jak může uživatel vybrat jednotlivá města a vidět Všechno informace filtrovány tak, aby se zobrazovaly pouze pro tato místa?

Jedním z řešení je vygenerovat stránku pro každé město - možné pomocí skriptu jazyka R, pokud používáte takzvané parametrizované přehledy. Můžete však také vytvořit jeden dokument R Markdown, který funguje jako interaktivní aplikace.

Přidejte lesklou interaktivitu

Chcete-li přidat lesklou interaktivitu do běžného dokumentu R Markdown, začněte přidáním runtime: lesklý do záhlaví YAML dokumentu, například:

---

název: „Střední příjem domácnosti podle PSČ“

výstup: html_document

runtime: lesklý

---

Jakmile to uděláte a stisknete Uložit, ikona úpletu v RStudiu se změní na „Spustit dokument“. Přestože výstup stále říká „html_document“, už to nebude prostý HTML. Nyní je to mini-lesklá aplikace.

Sharon Machlis / Sharon Machlis,

Nechte uživatele, aby si vybrali data

Nyní potřebuji způsob, jak si uživatelé mohou vybrat svá data. Shiny má k tomu řadu „vstupních widgetů“. Budu používat selectInput (), který vytváří rozevírací seznam a umožňuje uživatelům vybrat si více než jednu položku. Shiny má další widgety pro přepínací tlačítka, zadávání textu, voliče data a další. Jejich sbírku si můžete prohlédnout v galerii lesklých widgetů RStudio.

Kód pro moji miniaplikaci selectInput () rozevírací seznam má pět argumentů a vypadá takto:

selectInput ("mycities", "Choose 1 or more cities:",

choices = sort (unique (markdowndata $ City)),

selected = "Boston", multiple = TRUE)

První argument proselectInput (), mycities je název proměnné, který jsem zvolil pro ukládání hodnot, které uživatel vybere. Druhým argumentem je text záhlaví, který se zobrazí v rozevíracím seznamu. Třetí argument, volby, je vektor všech možných hodnot v rozevíracím seznamu - v tomto případě jedinečné hodnoty názvů měst v mých datech, seřazené podle abecedy. vybráno = Boston znamená, že rozevírací seznam bude výchozí pro vybrané město Boston (výběr výchozího výběru je volitelný). A nakonec, násobek = PRAVDA umožňuje uživatelům vybrat si více než jedno město najednou.

Tento kód vytvoří rozevírací seznam HTML. Pokud to spustíte selectInput () kód ve vaší konzole R, vygeneruje HTML pro rozevírací seznam (za předpokladu, že máte načtený Shiny a datový rámec s názvem markdowndata se sloupcem City).

Dále musím napsat nějaké R, aby tento rozevírací seznam skutečně něco udělal.

Vytvářejte dynamické proměnné

Tuto logiku interaktivity napíšu na dvě části:

  1. Vytvořte datový rámec - já tomu budu říkat mydata—To se filtruje pokaždé, když si uživatel vybere město.
  2. Napište kód pro text, histogram a tabulku dat, které se všechny změní na základě mého dynamického datového rámce.

Nejdůležitější věcí, kterou je třeba mít na paměti v tomto bodě, je, že tyto objekty již nejsou „běžnými“ proměnnými R. Jsou dynamický. Ony změna na základě akcí uživatele. A to znamená, že fungují mírně odlišně než proměnné, na které jste pravděpodobně zvyklí.

Co je na nich zvláštního? Tady jsou tři věci, které potřebujete vědět:

  1. Pro přístup k hodnotě vstupní proměnné, která ukládá informace od vašeho uživatele, potřebujete syntaxi zadejte $ myvarname, nejen jednoduše myvarname. Takže pro hodnoty uložené v mycities rozevírací seznam, použijte zadejte $ mycities
  2. Objekty, jako jsou grafy a tabulky, které závisí na hodnotách od vašeho uživatele, jsou také dynamické a musí být reaktivní. Je to stejně snadné jako zabalit je do speciální funkce, ale musíte si to pamatovat. Rovněž k nim nelze přistupovat pouze pomocí jejich jmen, ale vyžadují také závorky: syntaxi jako myvar () a ne myvar.
  3. Když vásZobrazit dynamický obsah - opět věci jako tabulka, mapa, histogram nebo dokonce text - je třeba jej vykreslit zvláštním způsobem, obvykle pomocí některé ze speciálních funkcí vykreslení Shiny. Dobrou zprávou je, že Shiny se stará o většinu funkcí monitorování změn a výpočtu výsledků. Musíte jen vědět, kterou funkci použít, a poté ji zahrnout do svého kódu.

To je často jednodušší, než to může znít. Takto bych vytvořil datový rámec s názvem mydata které se mění pokaždé, když uživatel vybere město pomocí mycities selectInput () rozbalovací nabídka:

mydata <- reaktivní ({

filtr (markdowndata, město% v% vstup $ mycities)

})

The mydata objekt nyní obsahuje a reaktivní výraza změní hodnotu pokaždé, když uživatel provede změnu v rozevíracím seznamu ovládání mycities.

Zobrazit dynamické proměnné

Nyní bych chtěl kódovat tabulku použitím to filtrováno mydata data.

Jak jste už možná uhodli, DT :: datatable (mydata) nebude fungovat. A existují dva důvody proč.

Nejprve proto mydata je reaktivní výraz, nemůžete na něj odkazovat pouze jménem. Potřebuje po něm závorky, napříkladmydata ().

Ale za druhé,DT :: datatable (mydata ()) nebude fungovat ani jako samostatný kód. Zobrazí se chybová zpráva, například:

 Provoz není povolen bez aktivního reaktivního kontextu.

(Pokusili jste se udělat něco, co lze udělat jen zevnitř

reaktivní výraz nebo pozorovatel.)

Když poprvé začínáte, verze této chybové zprávy se mohou zobrazovat poměrně často. Znamená to, že se snažíte zobrazit něco dynamického pomocí konvenční syntaxe R.

Abych to napravil, potřebuji Lesklý funkce vykreslení. Několik vizualizačních balíčků má své vlastní speciální lesklé vykreslovací funkce, včetně DT. Jeho funkce vykreslení je renderDT (). Pokud přidám renderDT ({}) kolem kódu DT a znovu spustit dokument, to by mělo fungovat.

Toto je můj tabulkový kód:

renderDT ({

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

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

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

})

Poznámka: Kromě vytvoření a zobrazení tabulky tento kód přidává také některé formátování. Sloupce 4 a 5 se zobrazují jako měna se znakem dolaru a čárkami. Druhý formatCurrency () řádek pro sloupec 6 přidá čárky k zaokrouhleným číslům bez znaku dolaru, protože jsem jako symbol měny zadal „“.

Mohu použít totéž mydata () reaktivní datový rámec k vytvoření histogramu pomocí jiné funkce 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 = dolar)

})

Tento kód také obsahuje malý styl ggplot, jako je výběr barev pro obrys pruhu a výplň a změna motivu grafu. Poslední řádek formátuje osu x tak, aby přidával znaky dolaru a čárky, a vyžaduje balíček váhy.

Každý z těchto bloků kódu R musí být v bloku kódu R Markdown, stejně jako všechny ostatní bloky kódu R v konvenčním dokumentu Markdown. To by mohlo vypadat podobně jako kód níže, který také pojmenuje část „histo“ (jména jsou volitelná) a nastaví šířku a výšku mého pozemku v palcích.

`` {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 = dolar)

})

```

Pokud bych chtěl zobrazit interaktivní text, který se mění s výběrem uživatele, potřebuji funkci Shiny render s názvem — překvapení! -renderText (). Můžete to dát do bloku kódu nebo použít alternativní formát syntaxe R Markdown mimo bloky kódu, jako je tento:

Mám nějaký prostý text a pak přidám `r R KÓD BUDE HODNOCEN ZDE`

Syntaxe pro toto je jeden backtick následovaný bezprostředně malým písmenem r, mezerou, R kódem, který chcete vyhodnotit, a končí dalším samostatným backtickem. Chcete-li tedy přidat histogram pro dynamický nadpis, můžete použít tento kód:

Histogram pro `r renderText ({input $ mycities})`

To funguje dobře pro jedno město. Pokud však existuje více než jedno město, zobrazí tento kód pouze názvy bez čárek mezi nimi, například Boston Cambridge Amherst. U veřejného kódu byste to chtěli trochu vylepšit, možná pomocí základních R. vložit() funkce:

Histogram pro `r renderText ({paste (zadejte $ mycities,

sep = "", collapse = ",")}) `

Podobný kód můžete použít ke generování textu, který uživatelům sděluje PSČ s nejvyšším a nejnižším mediánem. Pro tyto výpočty jsem vytvořil jeden reaktivní datový rámec obsahující řádek s nejvyšším příjmem domácnosti a další s nejnižším.

Také jsem zjistil, že nejnižší střední příjem byl podezřele nízký - 2 500 $ v univerzitní komunitě v Amherstu v Massachusetts - kde průměrné měsíční náklady na bydlení jsou 1 215 $. Můj odhad je, že jde o koncentraci studentského bydlení, takže jsem vyloučil jakékoli PSČ se středním příjmem domácnosti nižším než 5 000 $.

Zde je kód k vytvoření těchto dvou datových rámců:

zip_highest_income_row <- reaktivní ({

filtr (mydata (), MedianHouseholdIncome == max (MedianHouseholdIncome, na.rm = PRAVDA))

})

zip_lowest_income_row <- reaktivní ({

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

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

})

To by mělo vypadat jako typické dplyr filtr () kód, kromě toho, že 1) každý je zabalen do a reaktivní ({}) funkce a 2) mydata dynamický datový rámec, který se mění na základě vstupu uživatele, se označuje jako mydata () a ne jednoduše mydata

Chcete-li zobrazit hodnotu první položky v zip_highest_income_row sloupec ZIP datového rámce, nemohu použít obvyklý R kód jakozip_highest_income_row $ Zip [1]. Místo toho musím odkazovat na dynamický datový rámec se závorkami:zip_highest_income_row () $ Zip [1] . A pak to zabalte do Lesklé poskytnout() funkce — v tomto případě renderText ():

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

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

má nejvyšší střední příjem ve vámi vybraném místě,

`r renderText (váhy :: dolar (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á nejnižší

střední příjem ve vámi vybraném místě,

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

Spusťte a sdílejte svou aplikaci Shiny

Jakmile přidáte runtime: lesklý na R Markdown, už to není soubor HTML - je to mini lesklá aplikace. A to znamená, že ke spuštění potřebuje lesklý server.

Jak jsem již zmínil, kdokoli s R, RStudio a lesklým balíčkem má na svém lokálním systému server Shiny. Díky tomu je snadné sdílet jakoukoli aplikaci Shiny s ostatními uživateli R. Můžete jim poslat dokument e-mailem nebo, elegantněji, zveřejnit jej online jako soubor se zipem a použít shiny :: runUrl () příkaz. Existují speciální runGitHub () a runGist () funkce pro aplikace na GitHubu, které jsou pohodlné, pokud používáte GitHub pro projekty, které automaticky zazipují další soubory v projektu, například datové soubory.

Je však pravděpodobné, že v určitém okamžiku budete chtít ukázat svou práci uživatelům, kteří nepoužívají R, a to vyžaduje veřejně přístupný lesklý server. Pravděpodobně nejjednodušší možností je služba shinyapps.io RStudio. Je to zdarma pro několik omezených veřejných aplikací s velmi lehkým využitím. Cena placených účtů závisí na počtu aktivních hodin, které nabízejí pro vaše aplikace. Aktivní hodiny měří čas, který aplikace aktivně používá - jedna osoba na hodinu je stejná jako 100 lidí v danou hodinu. Abyste zajistili nepřetržitou provozuschopnost několika aplikací, potřebujete standardní účet 1100 $ / rok s 2 000 hodinami.

Můžete také vytvořit svůj vlastní server Shiny na cloudové službě, jako je AWS a instalace pro R, a bezplatná verze softwaru serveru RStudio Shiny. Existuje skvělý podrobný návod od Deana Attaliho, který ukazuje, jak to udělat, v Digital Ocean, kde můžete vytvořit a provozovat malý server Shiny za pouhých 5 $ za měsíc nákladů na hostování, aniž byste se museli starat o aktivní hodiny. Kompromisem je vlastní oprava a aktualizace R / knihovny - a pro robustní aplikace budete možná potřebovat větší virtuální server než ten nejlevnější 1G droplet.

Přidejte interaktivní mapu

Nakonec vás provedu tím, jak jsem do tohoto dokumentu přidal interaktivní mapu pomocí balíčku letáků.

Nejprve potřebujete soubor s geoprostorovými i číselnými daty, aby vaše aplikace poznala tvar každého PSČ. Níže uvedený kód vysvětluje, jak vytvořit rámec prostorových dat pomocí balíčků tidycensus a sf.

Pro interaktivitu vytvořím dynamickou verzi těchto prostorových dat, takže na mapě se zobrazí pouze vybraná města. Níže je můj kód, jak to udělat. Může to vypadat trochu repetitivně, ale místo stručnosti jde o čitelnost. Nebojte se zpřísnit svoji vlastní verzi.

mapdata <- reaktivní ({

if („All Mass“% in% input $ mycities) {

ma_appdata_for_map%>%

dplyr :: select (ZipCode = GEOID, MedianHouseholdIncome = medincome, MedianMonthlyHousingCost = medmonthlyhousingcost, Population = pop, City, County = county.name, State, Lat, Long, income, housing, Pop, geometry)%>%

mutovat(

Zvýrazněno = "Ano"

) %>%

sf :: st_as_sf ()

} else {

dplyr :: filter (ma_appdata_for_map, město% v% vstup $ mycities)%>%

dplyr :: select (ZipCode = GEOID, MedianHouseholdIncome = medincome, MedianMonthlyHousingCost = medmonthlyhousingcost, Population = pop, City, County = county.name, State, Lat, Long, income, housing, Pop, geometry)%>%

dplyr :: mutovat (

Zvýrazněno = ifelse (Město% v% vstup $ mycities, "Ano", "Ne")

) %>%

sf :: st_as_sf ()

}

})

Reaktivní funkce by už měla být známá. Můj -li a jiný prohlášení berou v úvahu, zda si uživatel vybral All Mass nebo jen jednotlivá města. U jakékoli volby kromě All Mass filtruji pouze vybraná města. V obou případech používám konvenční dplyr select () Funkce pro výběr sloupců, které chci na mapě, nezapomeňte zahrnout Lat pro zeměpisnou šířku, Long pro zeměpisnou délku a geometrii, která obsahuje soubory tvaru polygonu PSČ. Poslední řádek v každém li() část kódu zajišťuje, že výsledky jsou geoprostorovým objektem sf (jednoduché funkce). I když jsem tento kód nepotřeboval na svém místním počítači Mac, aplikace fungovala lépe na shinyapps.io, když jsem jej zahrnul.

Nyní je čas pracovat na barvách mapy. Pro svou letákovou mapu nastavím dvě reaktivní barevné palety, jednu pro příjem a druhou pro náklady na bydlení. V obou případech používám greeny, ale můžete si vybrat, co chcete.

nekompatibilní <- reaktivní ({

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

doména = mapdata () $ MedianHouseholdIncome)

})

housingpal <- reaktivní ({

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

doména = mapdata () $ MedianMonthlyHousingCost)

})

Chci, aby byly také reaktivní, takže se mění na základě výběru uživatelů. Argument doména definuje hodnoty, které bude paleta zobrazovat. V prvním případě je to sloupec MedianHouseholdIncome mého reaktivního objektu mapdata - s mapdata kódovanými jako mapdata () protože je reaktivní; v druhém případě je to sloupec MedianMonthlyHousingCost.

Rovněž nastavím přesně to, jak chci, aby se zobrazoval můj vyskakovací text. To může trvat směs HTML (

je konec řádku HTML) a sloupce datového rámce. I když určitě můžete použít základní R. vložit() nebo paste0 () Funkce shledávám balíček lepidla mnohem jednodušší, když pracuji s více než jednou proměnnou smíchanou s textem. Níže vidíte, že potřebuji vložit složené proměnné do složených závorek. Samozřejmě musí být také vyskakovací text reaktivní, takže se také mění výběrem uživatele.

mypopups <- reaktivní ({

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

Střední příjem domácnosti: {mapdata () $ příjem}

Střední měsíční náklady na bydlení: {mapdata () $ Housing}

Počet obyvatel: {mapdata () $ Pop}

Město: {mapdata () $ City}

Kraj: {mapdata () $ County} ")

})

Nakonec kód samotné mapy letáku.

leták :: renderLeaflet ({

leták (mapdata ())%>%

addProviderTiles ("CartoDB.Positron")%>%

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

fillOpacity = 0,7,

hmotnost = 1,0,

color = "black",

smoothFactor = 0,2,

popup = mypopups (),

group = "Příjem domácnosti"

) %>%

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

fillOpacity = 0,7,

hmotnost = 0,2,

color = "black",

smoothFactor = 0,2,

popup = mypopups (),

group = "Náklady na bydlení"

) %>%

addLayersControl (

baseGroups = c ("příjem domácnosti", "náklady na bydlení"),

position = "bottomleft",

options = layersControlOptions (sbaleno = FALSE)

)

})

renderLeaflet () je funkce Shiny render, která zobrazí dynamický dataviz spoléhající se na dynamický objekt mapdata. Uvnitř této funkce je „běžný“ kód pro mapování letáků. První řádek, leták (mapdata ()), vytvoří objekt letáku R. z reaktivního objektu mapdata. Používá balíček letáků, který je obálkou R do knihovny leaflet.js. Další řádek přidává styl dlaždic map na pozadí z CartoDB.

The addPolygons () funkce říká letáku, jak zobrazit polygony PSČ. Chci, aby to bylo zabarveno sloupcem MideanHouseholdIncome pomocí palety příjmů, kterou jsem nastavil dříve, neúplně. Většina ostatních argumentů je styling. The vyskakovat argument nastaví vyskakovací text na mypopups objekt, který jsem vytvořil dříve, a argument group pojmenuje vrstvu mapy.

Přidávám další podobnou vrstvu pro medián měsíčních nákladů na bydlení. A konečně addLayersControl () umístí legendu, na kterou lze kliknout, pro každou vrstvu vlevo dole.

Sharon Machlis /

Pokud se chcete dozvědět více o mapování v jazyce R s letákem, přečtěte si můj návod „Vytváření map v jazyce R v 10 (poměrně) snadných krocích.“

Konečný soubor R markdown

Na GitHubu můžete vidět finální soubor R Markdown. Pokud se na kód podíváte pečlivě, můžete si všimnout několika dodatků. Přidal jsem celou mši do selectInput () rozevírací seznam výběr vektoru, takže tento kód je nyní

selectInput ("mycities", "Choose 1 or more cities:",

choices = c ("All Mass", sort (unique (markdowndata $ City))),

multiple = TRUE, selected = "Boston")

A pak jsem vylepšil několik dalších řádků kódu, abych dal jinou možnost, pokud je vybrána možnost All Mass, například vytvoření dynamické proměnné selected_places, která řekne „Massachusetts“, pokud je „All Mass“ jedním z vybraných měst.

selected_places <- reaktivní ({

if („All Mass“% in% input $ mycities) {

"Massachusetts"

} else {

vložit (zadejte $ mycities,

sep = "", collaps = ",")

}

})

Všimněte si také nové hlavičky YAML:

---

název: „Střední příjem domácnosti podle PSČ“

výstup: html_document

soubory_zdroje:

- mamarkdowndata.rdata

- zip_mass_appdata_for_map.rds

runtime: lesklý

---

Žeresources_files: volba říká, že tento dokument vyžaduje ke spuštění dva další soubory, mamarkdowndata.rdata a zip_mass_appdata_for_map.rds. To umožňuje shinyapps.io vědět, že tyto soubory je třeba nahrát spolu s hlavním dokumentem R Markdown při nasazování souboru srsconnect :: deployDoc ("docname.Rmd").

Tento interaktivní dokument R Markdown s Shiny v akci můžete vidět na //idgrapps.shinyapps.io/runtimeshiny/. Načtení může chvíli trvat, protože jsem se nepokusil optimalizovat tento kód na rychlost. RStudio má nějaké zdroje, pokud se chcete dozvědět o urychlení lesklých aplikací.

Jak se to liší od „skutečné“ lesklé aplikace?

Tento super nabitý dokument Shiny R Markdown se liší od plnohodnotné aplikace Shiny několika klíčovými způsoby.

1. Lesklá aplikace musí být v jednom souboru s názvem app.R nebo ve dvou souborech ui.R a server.R. Aplikace může zdroj další soubory s jinými názvy, ale tato struktura pojmenování souborů je absolutní. V aplikaci s jedním souborem. Aplikace R jsou potřebné sekce pro uživatelské rozhraní (uživatelské rozhraní, které definuje, co uživatel vidí a s čím interaguje) a server.

2. Lesklá rozložení aplikací jsou postavena na mřížkovém rámci stránky Bootstrap. Více o struktuře rozvržení najdete v průvodci rozložením aplikace Shiny aplikace RStudio.

3. Nejdynamičtější komponenty, které chcete vykreslit, včetně věcí, jako jsou grafy a tabulky, musí být konkrétně umístěné někde na stránce s dalšími výstupními funkcemi a definicemi. Například interaktivní mapa letáků potřebuje kód, jako je leafletOutput ("mymap") někde v uživatelském rozhraní sdělit aplikaci, kde by se měla zobrazit, kromě kódu serveru, jako je

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

definovat logiku generování mapy.

Zde je příklad souboru Shiny app.R pro histogram a tabulku této aplikace:

knihovna („lesklá“)

knihovna ("dplyr")

knihovna ("ggplot2")

knihovna („DT“)

možnosti (scipen = 999)

load ("mamarkdowndata.rdata") # načte proměnnou markdowndata

ma_appdata_for_map <- readRDS ("zip_mass_appdata_for_map.rds")

# Definujte uživatelské rozhraní

ui <- fluidPage (

# Název aplikace

titlePanel („Příjmy a náklady na bydlení podle PSČ“),

# Postranní panel

rozvržení postranního panelu (

postranní panelPanel (

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

br (),

strong ("Poznámka: Některá města mohou mít pro poštovní směrovací čísla více než jedno místní jméno. Například Allston, Brighton, Dorchester a několik dalších čtvrtí nejsou zahrnuty v PSČ místní název \" Boston \ ".))

),

# Zobrazit histogram

mainPanel (

h4 (htmlOutput ("histogramHeadline")),

plotOutput ("myhistogram"),

br (),

h4 (htmlOutput ("tableHeadline")),

DTOutput ("mytable")

)

)

)

# Definujte logiku serveru potřebnou k nakreslení histogramu

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

mydata <- reaktivní ({

if („All Mass“% in% input $ mycities) {

markdowndata

} else {

filtr (markdowndata, město% v% vstup $ mycities)

}

})

selected_places <- reaktivní ({

if („All Mass“% in% input $ mycities) {

"Massachusetts"

} else {

vložit (zadejte $ mycities,

sep = "", collaps = ",")

}

})

výstup $ histogramHeadline <- renderUI ({

paste ("Histogram pro", selected_places (), "údaje o příjmu")

})

výstup $ tableHeadline <- renderUI ({

paste ("Data pro", 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 = dolar)

})

výstup $ mytable <- renderDT ({

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

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

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

})

}

# Spusťte aplikaci

shinyApp (ui = ui, server = server)

Další informace o vytváření těchto druhů aplikací Shiny najdete v úvodních cvičeních Shtiny RStudio.

Další tipy R najdete na stránce s videem Do More With R nebo v playlistu Do More With R na YouTube.

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