Programiranje

Spremenite dokument R Markdown v interaktivno izkušnjo

R Markdown je ena mojih najljubših stvari na sodobnem R. Ponuja enostaven način kombiniranja besedila, kode R in rezultatov kode R v enem dokumentu. In ko je ta dokument upodobljen kot HTML, lahko dodate nekaj uporabniške interakcije z gradniki HTML, kot je DT za tabele ali letak za zemljevide. (Če niste seznanjeni z R Markdownom, si lahko najprej ogledate video vadnico R Markdown in se nato vrnete sem.)

Morda pa ne veste, da obstaja način za še večjo interaktivnost R Markdown: z dodajanjem čas izvajanja: sijoč v glavo dokumenta.

Shiny je ogrodje spletne aplikacije za R. Kot ogrodje ima dokaj specifično strukturo. Vendar lahko dokument R Markdown pretvorite v sijočo aplikacijo ne da bi morali slediti veliko tej togi strukturi. Namesto tega lahko skočite naravnost in začnete kodirati - ne da bi vas skrbelo nekaj običajnih bleščečih nalog, na primer zagotavljanje pravilnosti vseh oklepajev in vejic v globoko ugnezdenih funkcijah postavitve.

Pravzaprav, tudi če ste izkušen bleščeč razvijalec, je dokument R Markdown še vedno koristen za sijoča ​​opravila, kjer ne potrebujete popolne aplikacije ali za hitro preizkušanje kode. Še vedno bo potreboval strežnik Shiny, če pa imate nameščen RStudio in svetleč paket, imate enega od njih že lokalno.

Oglejmo si, kako deluje Runtime Shiny v R Markdown.

1. Osnovni R Markdown

Začel bom s konvencionalnim, ne-bleščečim dokumentom R Markdown, ki vsebuje iskalno tabelo podatkov po poštni številki Massachusetts. Uporabniki lahko iščejo ali razvrščajo po katerem koli stolpcu tabele in odgovarjajo na vprašanja, na primer »Katere poštne številke imajo najvišji srednji dohodek gospodinjstva Middlesex County?« ali "Katere poštne številke imajo najcenejše mesečno stanovanje?"

Sharon Machlis /

Ta dokument ima tudi histogram, ki prikazuje porazdelitev srednjih dohodkov gospodinjstva, in besedilo, v katerem so navedene poštne številke z najvišjimi in najnižjimi dohodki. Tabela je interaktivna, preostali del dokumenta pa ne. Upodobljeno različico HTML si lahko ogledate na RPubiovih RStudio.

Če bi radi nadaljevali, lahko na GitHubu vidite kodo samostojne različice tega dokumenta R Markdown - vključno s podatki. Če pa želite videti, kako sem te demografske podatke spravil v R, je v tem članku koda R, da ustvarite svoj nabor podatkov (in kodo lahko prilagodite, da izberete drugo stanje). Če ustvarite svojo različico podatkov, je koda za osnovni dokument R Markdown z uporabo ločene podatkovne datoteke tudi na GitHubu.

Ne glede na to, kateri dokument R Markdown izberete, boste videli, da gre večinoma za statični dokument z nekaj interaktivnosti. Kaj pa, če bi rad celoten dokument biti interaktiven - v tem primeru si oglejte spreminjanje histograma in besedila ter tabelo? Kako lahko uporabnik izbere posamezna mesta in vidi vse informacije filtrirane za prikaz samo za ta mesta?

Ena od rešitev je ustvariti stran za vsako mesto - možno s skriptom R, če uporabljate tako imenovana parametrizirana poročila. Lahko pa ustvarite tudi en dokument R Markdown, ki deluje kot interaktivna aplikacija.

Dodajte sijočo interaktivnost

Če želite običajnemu dokumentu R Markdown dodati bleščečo interaktivnost, začnite z dodajanjem čas izvajanja: sijoč v glavo YAML dokumenta, kot so:

---

naslov: "Srednji dohodek gospodinjstva po poštni številki"

izhod: html_document

čas izvajanja: sijoč

---

Ko to storite in pritisnete Shrani, se ikona pletenja v RStudio spremeni v »Zaženi dokument«. Čeprav na izhodu še vedno piše »html_document«, to ne bo več navaden HTML. Zdaj je mini-Shiny aplikacija.

Sharon Machlis / Sharon Machlis,

Naj uporabniki izbirajo podatke

Zdaj rabim način, kako lahko uporabniki sami izbirajo podatke. Shiny ima za to številne "vhodne pripomočke". Uporabil bom selectInput (), ki ustvari spustni seznam in uporabnikom omogoča, da izberejo več kot en element. Shiny ima druge pripomočke za izbirne gumbe, vnose besedila, izbirnike datumov in še več. Njihovo zbirko si lahko ogledate v galeriji sijočih pripomočkov RStudio.

Koda za mojo mini-aplikacijo selectInput () spustni seznam ima pet argumentov in je videti tako:

selectInput ("moja mesta", "Izberi eno ali več mest:",

izbire = razvrsti (edinstveno (markdowndata $ City)),

izbrano = "Boston", več = TRUE)

Prvi argument zaselectInput (), mesta je ime spremenljivke, ki sem jo izbral za shranjevanje vseh vrednosti, ki jih izbere uporabnik. Drugi argument je besedilo glave, ki se prikaže s spustnim seznamom. Tretji argument, izbire, je vektor vseh možnih vrednosti na spustnem seznamu - v tem primeru edinstvene vrednosti imen mest v mojih podatkih, razvrščenih po abecedi. izbrano = Boston pomeni, da bo spustni meni privzeto izbran za mesto Boston (izbira privzete izbire ni obvezna). In končno, več = TRUE omogoča uporabnikom, da izberejo več mest hkrati.

Ta koda ustvari spustni seznam HTML. Če zaženete to selectInput () kode v vaši konzoli R, bo ustvaril HTML za spustni meni (ob predpostavki, da ste naložili Shiny in podatkovni okvir, imenovan markdowndata s stolpcem City).

Nato moram napisati nekaj R, tako da ta spustni seznam dejansko nekaj naredi.

Ustvarite dinamične spremenljivke

To logiko interaktivnosti bom kodiral v dva dela:

  1. Ustvari podatkovni okvir - poklical ga bom mydata—Filtrira se vsakič, ko uporabnik izbere mesto.
  2. Napiši kodo za besedilo, histogram in podatkovno tabelo, ki se bodo spremenile glede na moj dinamični podatkovni okvir.

Na tem mestu je najpomembneje, da ti predmeti niso več „običajne“ spremenljivke R. So dinamično. Oni spremembe na podlagi uporabnikovih dejanj. In to pomeni, da delujejo nekoliko drugače kot spremenljivke, ki ste jih verjetno vajeni.

Kaj je posebnega pri njih? Tu so tri stvari, ki jih morate vedeti:

  1. Za dostop do vrednosti vhodne spremenljivke, ki hrani podatke od vašega uporabnika, potrebujete sintakso vnesite $ myvarname, ne preprosto myvarname. Torej, za vrednosti, shranjene v mesta spustni seznam, uporabite vnesite $ mycities
  2. Predmeti, kot so grafi in tabele, ki so odvisni od vrednosti vašega uporabnika, so tudi dinamični in morajo biti reaktivni. To je tako enostavno, kot da jih zavijete v posebno funkcijo, vendar tega se morate spomniti. Do njih tudi ne morejo dostopati samo z njihovimi imeni, ampak zahtevajo tudi oklepaje: sintaksa kot myvar () in ne myvar.
  3. Ko tizaslon dinamična vsebina - spet stvari, kot so tabela, zemljevid, histogram ali celo besedilo - jo je treba upodobiti na poseben način, običajno z uporabo ene od posebnih funkcij upodabljanja Shiny. Dobra novica je, da Shiny skrbi za večino funkcionalnosti spremljanja sprememb in izračunavanja rezultatov. Vedeti morate le, katero funkcijo uporabiti, in jo nato vključiti v svojo kodo.

Vse to je pogosto lažje, kot se morda sliši. Evo, kako bi ustvaril podatkovni okvir z imenom mydata ki se spremeni vsakič, ko uporabnik z mestom izbere mesto mycities selectInput () spustni meni:

mydata <- reaktivni ({

filter (markdowndata, City% v% input $ mycities)

})

The mydata predmet zdaj vsebuje reaktivni izrazin bo vrednost spremenila vsakič, ko uporabnik spremeni nadzor spustnega seznama mesta.

Prikaži dinamične spremenljivke

Zdaj bi rad kodiral tabelo uporabo ki se filtrira mydata podatkov.

Kot ste že uganili, DT :: datatable (mydata) ne bo delovalo. Za to sta dva razloga.

Prvič, ker mydata je reaktivni izraz, nanj se ne morete sklicevati samo z imenom. Za njo potrebujejo oklepaje, na primermydata ().

Ampak, drugič,DT :: datatable (mydata ()) tudi ne bo delovala kot samostojna koda. Prejeli boste sporočilo o napaki, približno tako:

 Delovanje ni dovoljeno brez aktivnega reaktivnega konteksta.

(Poskušali ste narediti nekaj, kar je mogoče storiti samo od znotraj

reaktivni izraz ali opazovalec.)

Različice tega sporočila o napaki boste morda videli pogosto, ko prvič začnete. To pomeni, da poskušate prikazati nekaj dinamičnega z uporabo običajne sintakse R.

Da bi to popravil, potrebujem Shiny funkcija upodabljanja. Več vizualizacijskih paketov ima svoje posebne funkcije Shiny render, vključno z DT. Njegova funkcija upodabljanja je renderDT (). Če dodam renderDT ({}) okoli kode DT in znova zaženite dokument, kar bi moralo delovati.

To je moja koda tabele:

renderDT ({

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

formatCurrency (4: 5, številke = 0)%>%

formatCurrency (6, currency = "", številke = 0)

})

Opomba: poleg ustvarjanja in prikaza tabele ta koda doda tudi nekaj oblikovanja. Stolpca 4 in 5 sta prikazana kot valuta z znakom dolarja in vejicami. Drugi formatCurrency () vrstica za stolpec 6 vejice doda zaokroženim številkam brez znaka za dolar, ker sem kot simbol valute določil "".

Lahko uporabim isto mydata () reaktivni podatkovni okvir za ustvarjanje histograma z uporabo druge funkcije 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 (etikete = dolar)

})

Ta koda vključuje tudi malo stila ggplot, na primer izbiro barv za oris vrstice ter polnjenje in spreminjanje teme grafa. Zadnja vrstica oblikuje os x, da doda dolarske znake in vejice, in zahteva paket tehtnic.

Vsak od teh blokov kode R mora biti znotraj dela kode R Markdown R, tako kot kateri koli drugi del kode R v običajnem dokumentu Markdown. To bi lahko izgledalo podobno spodnji kodi, ki prav tako imenuje delček "histo" (imena niso obvezna) in določa širino in višino moje ploskve v palcih.

"" {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 (etikete = dolar)

})

```

Če bi rad prikazal interaktivno besedilo, ki se spremeni z izbiro uporabnika, potrebujem funkcijo Shiny render z imenom - presenečenje! -renderText (). To lahko vstavite v del kode ali uporabite nadomestni format skladnje R Markdown zunaj kosov kode, kot je ta:

Imam nekaj navadnega besedila in nato dodam `R KODA BO OCENJENA TUKAJ`

Sintaksa tega je en povratni kljuk, ki mu takoj sledijo male črke r, presledek, koda R, ki jo želite ovrednotiti, in se konča z drugo povratno palico. Torej, če želite dodati dinamični naslov za histogram, lahko uporabite takšno kodo:

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

To dobro deluje za posamezno mesto. Če pa je več mest, bo ta koda samo prikazala imena brez vejic med njimi, na primer Boston Cambridge Amherst. Za kodo, ki se sooča z javnostjo, bi to nekoliko želeli, morda z uporabo osnovnih R-jev prilepi () funkcija:

Histogram za `r renderText ({paste (vnesite $ mycities,

sep = "", kolaps = ",")}) `

Podobno kodo lahko uporabite za ustvarjanje besedila, ki uporabnikom sporoča poštne številke z najvišjimi in najnižjimi srednjimi dohodki. Za te izračune sem ustvaril en reaktivni podatkovni okvir, ki vsebuje vrstico z najvišjim dohodkom gospodinjstva, in drugi z najnižjim.

Ugotovil sem tudi, da je bil najnižji srednji dohodek sumljivo nizek - 2.500 ameriških dolarjev v občini Amherst, Massachusetts, kjer so povprečni mesečni stroški stanovanja 1.215 dolarjev. Predvidevam, da gre za koncentracijo študentskih stanovanj, zato sem izključil vse poštne številke s povprečnim dohodkom gospodinjstva manj kot 5000 USD.

Tu je koda za ustvarjanje teh dveh podatkovnih okvirov:

zip_highest_income_row <- reaktivni ({

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

})

zip_lowest_income_row <- reaktivni ({

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

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

})

To bi moralo izgledati tipično dplyr filter () koda, le da je 1) vsaka ovita v reaktivni ({}) in 2) mydata dinamični podatkovni okvir, ki se spreminja na podlagi vnosa uporabnika, se imenuje mydata () in ne preprosto mydata

Za prikaz vrednosti prvega elementa v zip_highest_income_row stolpca ZIP podatkovnega okvira, ne morem uporabiti običajne kode R, kot jezip_highest_income_row $ Zip [1]. Namesto tega se moram sklicevati na dinamični podatkovni okvir z oklepaji:zip_highest_income_row () $ Zip [1] . In nato to zavijte v Shiny upodobi () funkcija - v tem primeru renderText ():

Poštna številka `r renderText (zip_highest_income_row () $ ZipCode [1])` v

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

ima najvišji srednji dohodek v krajih, ki ste jih izbrali,

`r renderText (lestvice :: dolar (zip_highest_income_row () $ MedianHouseholdIncome [1]))`.

Poštna številka `r renderText (zip_lowest_income_row () $ ZipCode [1])` v

`r renderText (zip_lowest_income_row () $ City [1])` ima najnižjo

srednji dohodek v krajih, ki ste jih izbrali,

`r renderText (lestvice :: dolar (zip_lowest_income_row () $ MedianHouseholdIncome [1]))`.

Zaženite in delite svojo aplikacijo Shiny

Ko dodate čas izvajanja: sijoč za R Markdown to ni več datoteka HTML - to je mini Shiny aplikacija. To pomeni, da za zagon potrebuje strežnik Shiny.

Kot sem že omenil, ima vsakdo z R, RStudio in svetlečim paketom strežnik Shiny v svojem lokalnem sistemu. Tako lahko katero koli aplikacijo Shiny enostavno delite z drugimi uporabniki R-ja. Dokument jim lahko pošljete po e-pošti ali, bolj elegantno, ga objavite v spletu kot stisnjeno datoteko in uporabite sijoča ​​:: runUrl () ukaz. Obstajajo posebne runGitHub () in runGist () funkcije za aplikacije v GitHubu, ki so priročne, če GitHub uporabljate za projekte, ki samodejno stisnejo dodatne datoteke v vašem projektu, na primer podatkovne datoteke.

Toda verjetno je, da boste nekoč želeli svoje delo pokazati uporabnikom, ki niso R, in za to je potreben javno dostopen strežnik Shiny. Verjetno najlažja možnost je storitev RStudio shinyapps.io. Brezplačno je za nekaj omejenih javnih aplikacij z zelo lahko uporabo. Cene plačljivih računov temeljijo na številu aktivnih ur, ki jih ponujajo za vaše aplikacije. Aktivne ure merijo čas, v katerem se aplikacija aktivno uporablja - ena oseba, vključena eno uro, je enaka uri kot 100 ljudi v tej uri. Da bi zagotovili 24-urno neprekinjeno delovanje nekaterih aplikacij, potrebujete standardni račun v višini 1100 USD na leto z 2000 urami.

Svoj lasten strežnik Shiny lahko zgradite tudi na storitvi v oblaku, kot sta AWS in namestitve za R ter brezplačno različico strežniške programske opreme RStudio's Shiny. Obstaja odlična vadnica po korakih Deana Attalija, ki prikazuje, kako to storiti v Digital Ocean, kjer lahko zgradite in zaženete majhen strežnik Shiny za samo 5 USD na mesec stroškov gostovanja, ne da bi vas skrbelo za aktivne ure. Kompromis opravljate lastne popravke in posodobitve R / knjižnice - in morda boste potrebovali boljši navidezni strežnik kot najcenejša kapljica 1G za robustne aplikacije.

Dodajte interaktivni zemljevid

Na koncu vam bom predstavila, kako sem temu dokumentu dodala interaktivni zemljevid s pomočjo letaka.

Najprej potrebujete datoteko z geoprostorskimi podatki in številčnimi podatki, tako da vaša aplikacija pozna obliko vsake poštne številke. Spodnja koda pojasnjuje, kako ustvariti okvir prostorskih podatkov s pomočjo paketov tidycensus in sf.

Za interaktivnost bom ustvaril dinamično različico teh prostorskih podatkov, tako da bodo na zemljevidu prikazana samo izbrana mesta. Spodaj je moja koda za to. Mogoče se zdi nekoliko ponavljajoče se, a namesto kratkosti grem k berljivosti. Prosto zategnite svojo različico.

mapdata <- reaktivni ({

if ("All Mass"% v% input $ mycities) {

ma_appdata_for_map%>%

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

mutiraj (

Označeno = "Da"

) %>%

sf :: st_as_sf ()

} še {

dplyr :: filter (ma_appdata_for_map, City% v% input $ mycities)%>%

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

dplyr :: mutate (

Označeno = ifelse (Mesto% v% input $ mycities, "Da", "Ne")

) %>%

sf :: st_as_sf ()

}

})

Reaktivna funkcija bi morala biti že znana. Moj če in drugače izjave upoštevajo, ali je uporabnik izbral All Mass ali samo posamezna mesta. Za katero koli izbiro, razen za vso mašo, filtriram samo izbrana mesta. V obeh primerih uporabljam običajni dplyr select () funkcijo za izbiro stolpcev, ki jih želim na zemljevidu, pri tem pazite, da vključite Lat za zemljepisno širino, Long za zemljepisno dolžino in geometrijo, ki vsebuje datoteke oblike poligonov poštne številke. Zadnja vrstica v vsaki če () odsek kode poskrbi, da so rezultati geoprostorski objekt sf (preproste funkcije). Čeprav te kode nisem potreboval na lokalnem Macu, je aplikacija delovala bolje na shinyapps.io, ko sem jo vključil.

Zdaj je čas za delo na barvah zemljevidov. Za zemljevid letakov bom postavil dve reaktivni barvni paleti, eno za dohodek in drugo za stanovanjske stroške. V obeh primerih uporabljam zelenico, vendar lahko izberete katero koli, ki jo želite.

dohodapal <- reaktivni ({

letak :: colorNumeric (paleta = "Zeleni",

domain = mapdata () $ MedianHouseholdIncome)

})

housingpal <- reaktivni ({

letak :: colorNumeric (paleta = "Zeleni",

domain = mapdata () $ MedianMonthlyHousingCost)

})

Želim, da so tudi te reaktivne, zato se spreminjajo glede na izbire uporabnikov. Argument domene definira vrednosti, ki jih bo prikazala paleta. V prvem primeru je to stolpec MedianHouseholdIncome mojega reaktivnega mapdata - z mapdata kodiran kot mapdata () saj je reaktiven; v drugem primeru je to stolpec MedianMonthlyHousingCost.

Nastavil bom tudi natančno, kako želim, da se prikaže moje pojavno besedilo. To lahko vključuje mešanico HTML (

je prelom vrstice HTML) in stolpci podatkovnega okvira. Medtem ko lahko zagotovo uporabite osnovno R-je prilepi () ali prilepi0 () funkcije, se mi zdi paket lepila veliko lažji, če imam več spremenljivk, pomešanih z besedilom. Spodaj lahko vidite, da moram spremenljivke, ki jih želim ovrednotiti, priložiti le v zavite oklepaje. Seveda mora biti tudi pojavno besedilo reaktivno, zato se tudi to spremeni z izbiro uporabnika.

mypopups <- reaktivni ({

ljepilo :: lepilo ("Poštna številka: {mapdata () $ ZipCode}

Srednji dohodek gospodinjstva: {mapdata () $ dohodek}

Srednji mesečni stroški stanovanja: {mapdata () $ stanovanje}

Prebivalstvo: {mapdata () $ Pop}

Mesto: {mapdata () $ City}

Okrožje: {mapdata () $ County} ")

})

Na koncu še koda za karto z letaki.

letak :: renderLeaflet ({

letak (mapdata ())%>%

addProviderTiles ("CartoDB.Positron")%>%

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

fillOpacity = 0,7,

teža = 1,0,

barva = "črna",

smoothFactor = 0,2,

popup = mypopups (),

group = "Dohodek gospodinjstva"

) %>%

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

fillOpacity = 0,7,

teža = 0,2,

barva = "črna",

smoothFactor = 0,2,

popup = mypopups (),

group = "Stroški stanovanja"

) %>%

addLayersControl (

baseGroups = c ("Dohodek gospodinjstva", "Stanovanjski stroški"),

position = "bottomleft",

options = layerControlOptions (strnjeno = FALSE)

)

})

renderLeaflet () je funkcija Shiny upodabljanja, ki bo prikazala dinamični dataviz, ki se opira na objekt dinamičnih mapdata. Znotraj te funkcije je "običajna" koda za preslikavanje letakov. Prva vrstica, letak (mapdata ()), ustvari objekt zloženke R iz predmeta reaktivnih mapdata. Uporablja paket letakov, ki je ovoj R za knjižnico leaflet.js. Naslednja vrstica doda slog ploščic za ozadje iz CartoDB.

The addPolygons () funkcija letaku pove, kako prikazati poligone poštne številke. Želim, da ga obarva stolpec MideanHouseholdIncome s pomočjo dohodkovne palete, ki sem jo nastavil prej, yieldpal. Večina ostalih argumentov je stajling. The pojavno okno argument nastavi pojavno besedilo na mypopups objekt, ki sem ga ustvaril prej, in argument skupine daje ime sloju zemljevida.

Dodam še en podoben sloj za povprečne mesečne stroške stanovanja. In končno addLayersControl () spodaj levo postavi klikljivo legendo za vsako plast.

Sharon Machlis /

Če želite izvedeti več o preslikavi v R z letakom, si oglejte mojo vadnico "Ustvari zemljevide v R v 10 (dokaj) enostavnih korakih."

Končna datoteka z oznako R.

Končno datoteko R Markdown si lahko ogledate na GitHub. Če natančno pogledate kodo, boste morda opazili nekaj dodatkov. Sem dodal vso mašo selectInput () spustni seznam izbira vektor, tako da je koda zdaj

selectInput ("moja mesta", "Izberi eno ali več mest:",

choices = c ("Vsa masa", razvrščanje (edinstveno (markdowndata $ City))),

več = TRUE, izbrano = "Boston")

In potem sem popravil več drugih vrstic kode, da dam drugačno možnost, če je izbrana All Mass, na primer ustvarjanje dinamične spremenljivke selected_places, ki bo pisala "Massachusetts", če je "All Mass" eno od izbranih mest.

izbrana mesta <- reaktivno ({

if ("All Mass"% v% input $ mycities) {

"Massachusetts"

} še {

prilepi (vnesite $ mycities,

sep = "", kolaps = ",")

}

})

Upoštevajte tudi novo glavo YAML:

---

naslov: "Srednji dohodek gospodinjstva po poštni številki"

izhod: html_document

datoteke_datoteke:

- mamarkdowndata.rdata

- zip_mass_appdata_for_map.rds

čas izvajanja: sijoč

---

Toresources_files: možnost pravi, da ta dokument za zagon potrebuje še dve datoteki, mamarkdowndata.rdata in zip_mass_appdata_for_map.rds. To shinyapps.io omogoča vedeti, da je treba te datoteke naložiti skupaj z glavnim dokumentom R Markdown pri uvajanju datoteke zrsconnect :: deployDoc ("docname.Rmd").

Ta interaktivni dokument R Markdown z Shiny v akciji si lahko ogledate na //idgrapps.shinyapps.io/runtimeshiny/. Nalaganje lahko traja nekaj časa, ker nisem poskušal optimizirati te kode glede na hitrost. RStudio ima nekaj virov, če želite izvedeti več o pospeševanju Shiny aplikacij.

V čem se to razlikuje od 'prave' aplikacije Shiny?

Ta super napolnjen-s-Shiny R Markdown dokument se od polnopravne aplikacije Shiny razlikuje na nekaj ključnih načinov.

1. Shiny app mora biti v eni datoteki, imenovani app.R ali dve datoteki ui.R in server.R. Aplikacija lahko vir dodatne datoteke z drugimi imeni, vendar je ta struktura poimenovanja datotek absolutna. V aplikaciji z eno datoteko.R so potrebni odseki za uporabniški vmesnik (uporabniški vmesnik, ki določa, kaj uporabnik vidi in s čim komunicira) ter strežnik.

2. Sijajne postavitve aplikacij so zgrajene okoli ogrodja mreže Bootstrap. Več o strukturi postavitve si lahko ogledate v priročniku za postavitev sijočih aplikacij RStudio.

3. Večina dinamičnih komponent, ki jih želite upodabljati, vključno s stvarmi, kot so grafi in tabele, mora biti posebej postavljen nekje na strani z dodatnimi izhodnimi funkcijami in definicijami. Na primer, interaktivni zemljevid letakov bi potreboval kodo, kot je leafletOutput ("mymap") nekje v uporabniškem vmesniku, da aplikaciji poleg kode strežnika, kot je

izpiši $ mymap <- renderLeaflet ({#ZEMLJEVOD KOD TU})

za opredelitev logike ustvarjanja zemljevida.

Tu je primer datoteke Shiny app.R za histogram in tabelo te aplikacije:

knjižnica ("sijoča")

knjižnica ("dplyr")

knjižnica ("ggplot2")

knjižnica ("DT")

možnosti (scipen = 999)

load ("mamarkdowndata.rdata") # naloži spremenljivko markdowndata

ma_appdata_for_map <- readRDS ("zip_mass_appdata_for_map.rds")

# Določite uporabniški vmesnik

ui <- fluidPage (

# Naslov aplikacije

titlePanel ("Dohodki in stroški bivanja po poštni številki"),

# Stranska vrstica

stranska vrsticaRazporeditev (

stranska vrsticaPanel (

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

br (),

močan ("Opomba: nekatera mesta imajo lahko več krajevnih imen za poštne številke. Na primer, Allston, Brighton, Dorchester in nekatere druge soseske niso vključene v ime mesta s poštno številko \" Boston \ ".")

),

# Prikaži histogram

mainPanel (

h4 (htmlOutput ("histogramHeadline")),

plotOutput ("mojhistogram"),

br (),

h4 (htmlOutput ("tableHeadline")),

DTOutput ("mytable")

)

)

)

# Določite strežniško logiko, potrebno za risanje histograma

strežnik <- funkcija (vhod, izhod) {

mydata <- reaktivni ({

if ("All Mass"% v% input $ mycities) {

markdowndata

} še {

filter (markdowndata, City% v% input $ mycities)

}

})

izbrana mesta <- reaktivno ({

if ("All Mass"% v% input $ mycities) {

"Massachusetts"

} še {

prilepi (vnesite $ mycities,

sep = "", kolaps = ",")

}

})

izhod $ histogramHeadline <- renderUI ({

prilepi ("Histogram za", selected_places (), "podatki o dohodku")

})

izhod $ tableHeadline <- renderUI ({

prilepi ("Podatki za", selected_places ())

})

izhod $ myhistogram <- renderPlot ({

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

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

theme_classic () +

xlab ("") +

ylab ("") +

scale_x_continuous (etikete = dolar)

})

izhod $ mytable <- renderDT ({

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

formatCurrency (4: 5, številke = 0)%>%

formatCurrency (6, currency = "", številke = 0)

})

}

# Zaženite aplikacijo

shinyApp (ui = ui, strežnik = strežnik)

Več o izdelavi tovrstnih Shiny aplikacij lahko izveste v uvodnih vajah RStudio's Shiny.

Če želite več nasvetov R, pojdite na stran z videoposnetkom Naredite več z R na ali na seznam predvajanja Naredite več z R v YouTubu.

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