Programavimas

„R Markdown“ dokumentą paverskite interaktyvia patirtimi

„R Markdown“ yra vienas iš mano mėgstamiausių dalykų, susijusių su šiuolaikiniu R. Tai siūlo paprastą būdą sujungti tekstą, R kodą ir R kodo rezultatus į vieną dokumentą. Kai tas dokumentas pateikiamas kaip HTML, galite pridėti tam tikrą vartotojo sąveiką su HTML valdikliais, pvz., DT lentelėms ar lankstinuku žemėlapiams. (Jei nesate susipažinę su „R Markdown“, pirmiausia galite peržiūrėti mano „R Markdown“ vaizdo įrašo pamoką ir tada grįžti čia.)

Bet jūs galite nežinoti, kad yra būdas dar labiau sustiprinti „R Markdown“ interaktyvumą: pridedant vykdymo laikas: blizgus prie dokumento antraštės.

„Shiny“ yra R. žiniatinklio programų sistema. Kaip pagrindą, ji turi gana specifinę struktūrą. Tačiau „R Markdown“ dokumentą galite konvertuoti į „Shiny“ programą nereikalaujant laikytis daug tos standžios struktūros. Vietoj to, galite pereiti tiesiai ir pradėti koduoti - nesijaudindami dėl kai kurių tipiškų „Shiny“ užduočių, pvz., Užtikrindami, kad visi skliaustai ir kableliai būtų teisingi atliekant giliai įterptas išdėstymo funkcijas.

Tiesą sakant, net jei esate patyręs blizgus kūrėjas, „R Markdown“ dokumentas vis tiek gali būti naudingas atliekant blizgančias užduotis, kai jums nereikia pilnavertės programos ar greitai išbandant kodą. Jam vis tiek reikės „Shiny“ serverio, bet jei turite įdiegtą „RStudio“ ir blizgantį paketą, jau turite vieną iš jų vietoje.

Pažvelkime, kaip „R Markdown“ veikia blizgus veikimas.

1. Pagrindinis „R Markdown“

Pradėsiu nuo įprasto, „Shiny R Markdown“ dokumento, kuriame pateikiama duomenų lentelė, kurioje galima ieškoti pagal Masačusetso pašto kodą. Vartotojai gali ieškoti ar rūšiuoti pagal bet kurį lentelės stulpelį, atsakydami į tokius klausimus kaip „Kurie pašto kodai turi didžiausias vidutines namų ūkio pajamas Midlsekso grafystė? arba „Kokie pašto kodai turi brangiausią mėnesio būstą?“

Sharon Machlis /

Šiame dokumente taip pat yra histograma, rodanti namų ūkio vidutinių pajamų pasiskirstymą ir tekstą, kuriame nurodoma, kurie pašto kodai turi didžiausias ir mažiausias pajamas. Lentelė yra interaktyvi, tačiau likusi dokumento dalis nėra. Pateiktą HTML versiją galite pamatyti „RStudio“ RPub'uose.

Jei norite sekti toliau, „GitHub“ galite pamatyti šio „R Markdown“ dokumento atskiros versijos kodą, įskaitant duomenis. Arba, jei norite pamatyti, kaip aš patekau šiuos demografinius duomenis į R, šiame straipsnyje yra R kodas, kad sukurtumėte savo duomenų rinkinį (ir galite pakoreguoti kodą, kad pasirinktumėte kitą būseną). Jei kuriate savo duomenų versiją, pagrindinio „R Markdown“ dokumento kodas naudojant atskirą duomenų failą taip pat yra „GitHub“.

Nepriklausomai nuo pasirinkto „R Markdown“ dokumento, pamatysite, kad tai daugiausia statiškas dokumentas, turintis tam tikrą interaktyvumą. Bet ką daryti, jei norėčiau visas dokumentas kad būtų interaktyvus - šiuo atveju matykite histogramos ir teksto pasikeitimus bei lentelę? Kaip vartotojas gali pasirinkti atskirus miestus ir pamatyti visi informacija filtruota rodyti tik toms vietoms?

Vienas iš sprendimų yra sugeneruoti puslapį kiekvienam miestui - įmanoma naudojant R scenarijų, jei naudojate vadinamąsias parametruojamas ataskaitas. Tačiau taip pat galite sukurti vieną „R Markdown“ dokumentą, kuris veikia kaip interaktyvi programa.

Pridėkite blizgančią interaktyvumą

Norėdami pridėti „Shiny“ interaktyvumo prie įprasto „R Markdown“ dokumento, pirmiausia pridėkite vykdymo laikas: blizgus į dokumento YAML antraštę, pvz .:

---

pavadinimas: „Vidutinės namų ūkio pajamos pagal pašto kodą“

išvestis: html_document

vykdymo laikas: blizgus

---

Kai tai padarysite ir paspausite Išsaugoti, „RStudio“ mezgimo piktograma virsta „Vykdyti dokumentą“. Nors išvestyje vis dar sakoma „html_document“, ji nebebus paprasta HTML. Dabar tai yra „Mini Shiny“ programa.

Sharon Machlis / Sharon Machlis,

Leiskite vartotojams pasirinkti duomenis

Dabar man reikia, kad vartotojai galėtų pasirinkti savo duomenis. „Shiny“ tam turi daug „įvesties valdiklių“. Aš naudosiu selectInput (), kuris sukuria išskleidžiamąjį sąrašą ir leidžia vartotojams pasirinkti daugiau nei vieną elementą. „Shiny“ turi kitus valdiklius radijo mygtukams, teksto įvestims, datos parinkikliams ir kt. Jų kolekciją galite pamatyti „RStudio“ blizgių valdiklių galerijoje.

Mano mini programos kodas selectInput () išskleidžiamajame sąraše yra penki argumentai ir jis atrodo taip:

selectInput ("mycities", "Pasirinkite 1 ar daugiau miestų:",

pasirinkimai = rūšiuoti (unikalus (markdowndata $ City)),

pasirinkta = "Bostonas", keli = TIESA)

Pirmasis argumentasselectInput (), mycities yra kintamojo vardas, kurį pasirinkau saugoti bet kokias vartotojo pasirinktas vertes. Antrasis argumentas yra antraštės tekstas, kuris bus rodomas su išskleidžiamuoju sąrašu. Trečias argumentas, pasirinkimus, yra visų galimų išskleidžiamajame sąraše reikšmių vektorius - šiuo atveju unikalios mano pavadinimų miestų pavadinimų vertės, surikiuotos abėcėlės tvarka. pasirinkta = Bostonas reiškia, kad išskleidžiamasis meniu pagal numatytuosius nustatymus bus Bostonas, pasirinktas miestas (numatytąjį pasirinkimą pasirinkti nebūtina). Ir, galiausiai, kelis = TIESA leidžia vartotojams pasirinkti daugiau nei vieną miestą vienu metu.

Šis kodas sukuria išskleidžiamąjį HTML sąrašą. Jei tai paleisite selectInput () kodą jūsų „R“ konsolėje, jis sugeneruos išskleidžiamąjį meniu HTML (darant prielaidą, kad turite „Shiny“ ir duomenų rėmą, vadinamą markdowndata su stulpeliu Miestas).

Tada turiu parašyti šiek tiek R, kad šis išskleidžiamasis meniu iš tikrųjų kažką padarytų.

Kurkite dinaminius kintamuosius

Koduosiu šią interaktyvumo logiką iš dviejų dalių:

  1. Sukurkite duomenų rėmelį - aš jį pavadinsiu mydata- tai filtruojama kiekvieną kartą, kai vartotojas pasirenka miestą.
  2. Parašykite teksto, histogramos ir duomenų lentelės kodą, kuris visi pasikeis pagal mano dinaminių duomenų rėmelį.

Svarbiausia nepamiršti, kad šie objektai nebėra „įprasti“ R kintamieji. Jie yra dinamiškas. Jie pakeisti atsižvelgiant į vartotojo veiksmus. Tai reiškia, kad jie veikia šiek tiek kitaip nei kintamieji, prie kurių tikriausiai esate įpratę.

Kuo jie ypatingi? Štai trys dalykai, kuriuos turite žinoti:

  1. Norint pasiekti įvesties kintamojo, kuriame saugoma jūsų vartotojo informacija, vertę, reikia sintaksės įveskite $ myvarname, o ne paprasčiausiai myvarname. Taigi vertėms, saugomoms mycities išskleidžiamajame sąraše, naudokite įveskite $ mycities
  2. Objektai, pvz., Diagramos ir lentelės, kurie priklauso nuo jūsų vartotojo reikšmių, taip pat yra dinamiški ir turi būti reaktyvūs. Tai taip pat lengva, kaip juos suvynioti į specialią funkciją, bet reikia nepamiršti tai padaryti. Prie jų taip pat negalima prisijungti tik pagal jų vardus, tačiau reikia ir skliaustų: panašios į sintaksę myvaras () ir ne myvaras.
  3. Kada tuekranas dinaminį turinį - dar kartą tokius dalykus kaip lentelė, žemėlapis, histograma ar net tekstas - jis turi būti pateiktas specialiu būdu, paprastai naudojant vieną iš specialių „Shiny“ pateikimo funkcijų. Geros naujienos yra tai, kad „Shiny“ rūpinasi pokyčių stebėjimo ir rezultatų skaičiavimo funkcionalumu. Jums tereikia žinoti, kurią funkciją naudoti, tada įtraukti ją į savo kodą.

Tai dažnai būna lengviau, nei gali skambėti. Štai kaip aš sukūriau duomenų rėmą, vadinamą mydata kuris keičiasi kiekvieną kartą, kai vartotojas pasirenka miestą su mycities selectInput () išskleidžiamasis meniu:

mydata <- reaktyvus ({

filtras (žymėjimo duomenys, miesto%% input $ mycities)

})

mydata objektas dabar turi a reaktyvi išraiškair pakeis vertę kiekvieną kartą, kai vartotojas pakeis išskleidžiamojo sąrašo valdymą mycities.

Rodyti dinaminius kintamuosius

Dabar norėčiau užkoduoti lentelę naudojant kad filtruota mydata duomenis.

Kaip jau spėjote, DT :: duomenų bazė (mano duomenys) neveiks. Ir yra dvi priežastys, kodėl.

Pirma todėl, kad mydata yra reaktyvi išraiška, jūs negalite kreiptis į ją tik vardu. Po jo reikia skliaustų, tokių kaipmydata ().

Bet, antra,DT :: datatable (mydata ()) taip pat neveiks kaip atskiras kodas. Gausite klaidos pranešimą maždaug taip:

 Operacija neleidžiama be aktyvaus reaktyvaus konteksto.

(Jūs bandėte padaryti tai, ką galima padaryti tik iš vidaus

reaktyvi išraiška ar stebėtojas.)

Kai tik pradedate, šio klaidos pranešimo versijas galite pamatyti gana dažnai. Tai reiškia, kad bandote parodyti kažką dinamiško naudodami įprastą R sintaksę.

Norėdami tai išspręsti, man reikia blizgančio atvaizdavimo funkcija. Keli vizualizacijos paketai turi savo specialias „Shiny render“ funkcijas, įskaitant DT. Jo pateikimo funkcija yra „renderDT“ (). Jei pridursiu „renderDT“ ({}) aplink DT kodą ir dar kartą paleiskite dokumentą, tai turėtų veikti.

Tai yra mano stalo kodas:

„renderDT“ ({

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

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

formatCurrency (6, valiuta = "", skaitmenys = 0)

})

Pastaba: be lentelės kūrimo ir rodymo, šis kodas taip pat prideda tam tikrą formatavimą. 4 ir 5 stulpeliai rodomi kaip valiuta su dolerio ženklu ir kableliais. Antras formatCurrency () 6 stulpelio eilutė prideda kablelius prie suapvalintų skaičių be dolerio ženklo, nes aš valiutos simboliu nurodžiau "".

Aš galiu naudoti tą patį mydata () reaktyvių duomenų rėmelis histogramai sukurti naudojant kitą „Shiny render“ funkciją: „renderPlot“ ().

„renderPlot“ ({

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

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

theme_classic () +

xlab ("") +

ylab ("") +

scale_x_continuous (etiketės = doleris)

})

Tame kode taip pat yra šiek tiek „ggplot“ stiliaus, pavyzdžiui, juostos kontūro ir užpildymo spalvų pasirinkimas ir grafiko temos keitimas. Paskutinė eilutė suformatuoja x ašį, kad būtų pridėti dolerio ženklai ir kableliai, o tam reikia svarstyklių paketo.

Kiekvienas iš šių R kodo blokų turi būti R žymėjimo R kodo dalyje, kaip ir bet kuris kitas R kodo gabalas įprastame „Markdown“ dokumente. Tai gali atrodyti panašiai kaip žemiau pateiktas kodas, kuris taip pat įvardija gabalą „histo“ (vardai yra neprivalomi) ir mano sklypo plotį ir aukštį nustato coliais.

„{r histo, pav. plotis = 3, pav. aukštis = 2}

„renderPlot“ ({

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

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

theme_classic () +

xlab ("") +

ylab ("") +

scale_x_continuous (etiketės = doleris)

})

```

Jei norėčiau rodyti interaktyvų tekstą, kuris keičiasi atsižvelgiant į vartotojo pasirinkimą, man reikia „Shiny render“ funkcijos, kuri pavadinta - staigmena! -„renderText“ (). Galite įdėti tai į kodo dalį arba naudoti alternatyvų „R Markdown“ sintaksės formatą už tokių kodų dalių:

Turiu paprastą tekstą ir tada pridėsiu „R R KODAS Bus ĮVERTINAMAS ČIA“

Sintaksė tai yra vienas užpakalinis ženklas, po kurio iškart rašoma mažoji raidė r, tarpas, R kodas, kurį norite įvertinti, ir baigiasi kitu atskiru mygtuku. Taigi, norėdami pridėti dinaminę antraštę histogramai, galite naudoti tokį kodą:

Histograma „r renderText ({įveskite $ mycities}“)

Tai puikiai tinka vienam miestui. Tačiau, jei yra daugiau nei vienas miestas, tas kodas tiesiog parodys pavadinimus be kablelių tarp jų, pvz Bostono Kembridžo „Amherst“. Jei norite naudoti viešai rodomą kodą, norėtumėte tai šiek tiek padidinti, galbūt naudodami pagrindinius R įklijuoti () funkcija:

Histograma „r renderText ({paste (įveskite $ mycities,

sep = "", sutraukti = ",")}) "

Galite naudoti panašų kodą kurdami tekstą, kuriame vartotojams nurodomi pašto kodai, kurių vidutinės pajamos yra didžiausios ir mažiausios. Šiems skaičiavimams sukūriau vieną reaktyvų duomenų rėmelį, kuriame buvo eilutė, kurioje buvo didžiausios namų ūkio pajamos, o kitą - su mažiausiomis.

Aš taip pat atradau, kad mažiausios vidutinės pajamos buvo įtartinai mažos - 2 500 USD - Amhersto koledžo miestelio bendruomenėje (Mišios), kur vidutinė mėnesio būsto kaina yra 1 215 USD. Spėju, kad tai yra studentų būsto koncentracija, todėl neįtraukiau jokio pašto kodo, kurio vidutinės namų ūkio pajamos buvo mažesnės nei 5000 USD.

Štai kodas, skirtas sukurti tuos du duomenų rėmelius:

zip_highest_income_row <- reaktyvus ({

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

})

zip_lowest_income_row <- reaktyvus ({

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

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

})

Tai turėtų atrodyti tipiškai dplyr filtras () kodas, išskyrus tai, kad 1) kiekvienas yra suvyniotas į a reaktyvus ({}) funkcija ir 2) mydata dinaminis duomenų rėmas, kuris keičiasi atsižvelgiant į vartotojo įvestį, vadinamas mydata () o ne paprasčiausiai mydata

Norėdami parodyti pirmojo elemento vertę zip_highest_income_row duomenų rėmelio ZIP stulpelyje, negaliu naudoti įprasto R kodozip_highest_income_row $ Zip [1]. Vietoj to turiu nurodyti dinaminį duomenų rėmelį su skliaustais:zip_highest_income_row () $ Zip [1] . Ir tada suvyniokite į blizgančią pateikti () funkcija - šiuo atveju „renderText“ ():

Pašto kodas „r renderText (zip_highest_income_row () $ ZipCode [1])“

"r renderText (zip_highest_income_row () $ Miestas [1])"

turi didžiausias vidutines pajamas jūsų pasirinktoje (-ose) vietoje (-ėse),

`r renderText (svarstyklės :: doleris (zip_highest_income_row () $ MedianHouseholdIncome [1]))).

Pašto kodas „r renderText (zip_lowest_income_row () $ ZipCode [1])“

Mažiausias yra „r renderText (zip_lowest_income_row () $ City [1])“

vidutinės pajamos jūsų pasirinktoje (-ose) vietoje (-ėse),

"r renderText (svarstyklės :: doleris (zip_lowest_income_row () $ MedianHouseholdIncome [1]))".

Paleiskite ir bendrinkite savo „Shiny“ programą

Kai tik pridėsite vykdymo laikas: blizgus „R Markdown“, tai jau nėra HTML failas - tai yra „Mini Shiny“ programa. Tai reiškia, kad norint paleisti reikia „Shiny“ serverio.

Kaip jau minėjau anksčiau, visi, turintys R, RStudio ir blizgantį paketą, vietinėje sistemoje turi „Shiny“ serverį. Tai leidžia lengvai bendrinti bet kokią „Shiny“ programą su kitais „R“ vartotojais. Galite nusiųsti jiems dokumentą el. Paštu arba, elegantiškiau, paskelbti jį internete kaip ZIP failą ir naudoti blizgus :: runUrl () komandą. Yra specialių „runGitHub“ () ir „runGist“ () funkcijos „GitHub“ programoms, kurios yra patogios, jei projektams naudojate „GitHub“, o tai automatiškai užklijuos papildomus jūsų projekto failus, pvz., duomenų failus.

Tačiau yra tikimybė, kad tam tikru momentu norėsite parodyti savo darbus ne R vartotojams, o tam reikalingas viešai prieinamas „Shiny“ serveris. Turbūt lengviausias variantas yra „RStudio“ paslauga shinyapps.io. Tai nemokama kelioms ribotoms viešosioms programoms, kuriose naudojama labai lengva. Mokamų paskyrų kaina nustatoma atsižvelgiant į tai, kiek aktyvių valandų jie siūlo jūsų programoms. Aktyvios valandos matuoja laiką, kai programa yra aktyviai naudojama - vienas asmuo valandą praleidžia tą pačią valandą kaip ir 100 žmonių tą valandą. Norint užtikrinti 24x7 veiksnumą keliose programose, jums reikės 1 100 USD per metus standartinės sąskaitos su 2 000 valandų.

Taip pat galite sukurti savo „Shiny“ serverį naudodamiesi debesų paslauga, pvz., AWS ir R įrenginiais bei nemokama „RStudio“ „Shiny“ serverio programinės įrangos versija. Yra puiki žingsnis po žingsnio Deano Attali pamoka, parodanti, kaip tai padaryti „Digital Ocean“, kur galite sukurti ir valdyti nedidelį „Shiny“ serverį už vos 5 USD per mėnesį prieglobos išlaidas, nesijaudindami dėl aktyvių valandų. Kompromisas yra jūsų pačių pataisymas ir R / bibliotekos atnaujinimai - o norint tvirtų programų jums gali prireikti didesnio virtualaus serverio nei pigiausio 1G lašelio.

Pridėti interaktyvų žemėlapį

Galiausiai aš jums papasakosiu, kaip prie šio dokumento pridėjau interaktyvų žemėlapį naudodamas lankstinukų paketą.

Pirma, jums reikia failo su geoerdviniais ir skaitmeniniais duomenimis, kad jūsų programa žinotų kiekvieno pašto kodo formą. Žemiau pateiktas kodas paaiškina, kaip sukurti erdvinių duomenų rėmelį naudojant „tidycensus“ ir „sf“ paketus.

Interaktyvumo klausimais sukursiu dinaminę tų erdvinių duomenų versiją, todėl žemėlapyje bus rodomi tik pasirinkti miestai. Žemiau yra mano kodas, kaip tai padaryti. Tai gali atrodyti šiek tiek pasikartojantis, bet aš siekiu aiškumo, o ne trumpumo. Drąsiai sugriežtinkite savo versiją.

mapdata <- reaktyvus ({

if („Visos masės“%%% $ $ mycities) {

ma_appdata_for_map%>%

dplyr :: select (Pašto kodas = GEOID, MedianHouseholdIncome = medincome, MedianMonthlyHousingCost = medmonthlyhousingcost, Population = pop, City, County = county.name, State, Lat, Long, pajamos, būstas, Pop, geometrija)%>%

mutuoti(

Paryškinta = "Taip"

) %>%

sf :: st_as_sf ()

} Kitas {

dplyr :: filtras (ma_appdata_for_map, Miestas%% input $ mycities)%>%

dplyr :: select (Pašto kodas = GEOID, MedianHouseholdIncome = medincome, MedianMonthlyHousingCost = medmonthlyhousingcost, Population = pop, City, County = county.name, State, Lat, Long, pajamos, būstas, Pop, geometrija)%>%

dplyr :: mutate (

Paryškinta = ifelse (Miestas%% input $ mycities, "Taip", "Ne")

) %>%

sf :: st_as_sf ()

}

})

Reaktyvioji funkcija jau turėtų būti žinoma. Mano jei ir Kitas teiginiuose atsižvelgiama į tai, ar vartotojas pasirinko „All Mass“, ar tik atskirus miestus. Bet kokiam pasirinkimui, išskyrus visas mišias, filtruoju tik pasirinktus miestus. Abiem atvejais aš naudoju įprastą dplyr pasirinkti () funkciją pasirinkti norimus stulpelius žemėlapyje, būtinai įtraukite platumą Plat, ilgį ir geometriją, kurioje laikomi pašto kodo daugiakampio formos failai. Paskutinė eilutė kiekvienoje jei () kodo skyrius užtikrina, kad rezultatai būtų sf (paprastų funkcijų) geoerdvinis objektas. Nors man nereikėjo to kodo mano vietiniame „Mac“ kompiuteryje, programa geriau veikė svetainėje shinyapps.io, kai jį įtraukiau.

Dabar atėjo laikas dirbti su žemėlapio spalvomis. Savo lankstinukų žemėlapiui sukonstruosiu dvi reaktyvias spalvų paletes, vieną - pajamoms, kitą - būsto išlaidoms. Abiem atvejais aš naudoju žalumynus, bet jūs galite pasirinkti bet kurį, ko norite.

incomepal <- reaktyvus ({

lankstinukas :: colorNumeric (paletė = "Žalieji",

domain = mapdata () $ MedianHouseholdIncome)

})

housingpal <- reaktyvus ({

lankstinukas :: colorNumeric (paletė = "Žalieji",

domain = mapdata () $ MedianMonthlyHousingCost)

})

Noriu, kad ir jie būtų reaktyvūs, todėl jie keičiasi atsižvelgiant į vartotojo pasirinkimą. Domeno argumentas apibrėžia reikšmes, kurios bus rodomos paletėje. Pirmuoju atveju tai yra mano reaktyvaus „mapdata“ objekto stulpelis „MedianHouseholdIncome“ - žemėlapio duomenys užkoduoti kaip mapdata () kadangi jis yra reaktyvus; antruoju atveju tai stulpelis „MedianMonthlyHousingCost“.

Taip pat tiksliai nustatysiu, kaip noriu, kad mano iššokantis tekstas būtų rodomas. Tam gali prireikti HTML (

yra HTML eilutės pertrauka) ir duomenų rėmelių stulpeliai. Nors jūs tikrai galite naudoti bazinius R įklijuoti () arba įklijuoti0 () funkcijos, manau, kad klijų paketas yra daug lengvesnis, kai susiduriama su daugiau nei vienu kintamuoju, sumaišytu su tekstu. Žemiau matote, kad man tiesiog reikia pridėti kintamuosius, kuriuos noriu įvertinti, garbanotose petnešose. Žinoma, iššokantis tekstas taip pat turi būti reaktyvus, todėl jis taip pat keičiasi atsižvelgiant į vartotojo pasirinkimą.

mypopups <- reaktyvus ({

Klijai :: klijai ("Pašto kodas: {mapdata () $ ZipCode}

Vidutinės namų ūkio pajamos: {mapdata () $ pajamos}

Vidutinė mėnesio būsto kaina: {mapdata () $ būstas}

Gyventojų skaičius: {mapdata () $ Pop}

Miestas: {mapdata () $ Miestas}

Apygarda: {mapdata () $ County} ")

})

Galiausiai užrašykite patį lankstinukų žemėlapį.

lankstinukas :: renderLeaflet ({

lankstinukas (mapdata ())%>%

addProviderTiles ("CartoDB.Positron")%>%

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

užpildymo talpa = 0,7,

svoris = 1,0,

spalva = "juoda",

smoothFactor = 0,2,

iššokantis langas = mypopups (),

group = "Namų ūkio pajamos"

) %>%

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

užpildymo talpa = 0,7,

svoris = 0,2,

spalva = "juoda",

smoothFactor = 0,2,

iššokantis langas = mypopups (),

group = "Būsto išlaidos"

) %>%

addLayersControl (

baseGroups = c („Namų ūkio pajamos“, „Būsto išlaidos“),

pozicija = "apačia",

parinktys = layerControlOptions (sutrauktas = FALSE)

)

})

„renderLeaflet“ () yra „Shiny render“ funkcija, rodanti dinaminį dataviz, remdamasi dinaminių žemėlapių duomenų objektu. Šios funkcijos viduje yra „įprastas“ lankstinukų atvaizdavimo kodas. Pirmoji eilutė lankstinukas (mapdata ()), sukuria R lapelio objektą iš reaktyvaus mapdata objekto. Jis naudoja lankstinukų paketą, kuris yra R lankstinukas į „leaflet.js“ biblioteką. Kitoje eilutėje pridedamas „CartoDB“ fono žemėlapio plytelių stilius.

addPolygons () funkcija nurodo, kaip rodyti pašto kodo daugiakampius. Noriu, kad ją nuspalvintų „MideanHouseholdIncome“ stulpelis, naudodamasis anksčiau sukurta, nepilna, palete. Dauguma likusių argumentų yra stilius. iššokantis langas argumentas nustato iššokantįjį tekstą kaip mypopups objektą, kurį sukūriau anksčiau, o grupės argumentas suteikia pavadinimą žemėlapio sluoksniui.

Pridedu dar vieną panašų sluoksnį vidutinėms mėnesinėms būsto išlaidoms. Ir, pagaliau, „addLayersControl“ () apatiniame kairiajame kampe kiekvienam sluoksniui pateikia paspaudžiamą legendą.

Sharon Machlis /

Jei norite sužinoti daugiau apie žemėlapio sudarymą R su lankstinuku, žr. Mano pamoką „Kurkite žemėlapius R atlikdami 10 (gana) paprastų žingsnių“.

Galutinė R žymėjimo byla

Galutinį „R Markdown“ failą galite pamatyti „GitHub“. Atidžiai pažvelgę ​​į kodą, galite pastebėti keletą papildymų. Aš pridėjau visas mišias į selectInput () išskleidžiamajame sąraše pasirinkimo vektorių, todėl tas kodas yra dabar

selectInput ("mycities", "Pasirinkite 1 ar daugiau miestų:",

pasirinkimai = c („Visos masės“, rūšiavimas (unikalus (markdowndata $ City))),

kelis = TIESA, pasirinkta = „Bostonas“)

Tada aš pakoregavau keletą kitų kodo eilučių, kad suteikčiau kitokį variantą, jei pasirinkta „Visa masė“, pvz., Sukūriau dinaminį kintamąjį „Pasirinktos_ vietos“, kuriame sakoma „Masačusetsas“, jei „Visos masės“ yra vienas iš pasirinktų miestų.

selected_places <- reaktyvus ({

if („Visos masės“%%% $ $ mycities) {

„Masačusetsas“

} Kitas {

įklijuoti (įveskite $ mycities,

sep = "", sutraukti = ",")

}

})

Taip pat atkreipkite dėmesį į naują YAML antraštę:

---

pavadinimas: „Vidutinės namų ūkio pajamos pagal pašto kodą“

išvestis: html_document

išteklių_failai:

- mamarkdowndata.rdata

- zip_mass_appdata_for_map.rds

vykdymo laikas: blizgus

---

Taiištekliai_failai: parinktis sako, kad šiam dokumentui paleisti reikalingi dar du failai, mamarkdowndata.rdata ir zip_mass_appdata_for_map.rds. Tai leidžia shinyapps.io žinoti, kad tuos failus reikia įkelti kartu su pagrindiniu „R Markdown“ dokumentu, kai diegiate failą sursconnect :: deployDoc ("docname.Rmd").

Šį interaktyvų „R Markdown“ dokumentą su „Shiny“ galite pamatyti šiuo adresu: //idgrapps.shinyapps.io/runtimeshiny/. Tai gali užtrukti šiek tiek laiko, nes nebandžiau optimizuoti šio kodo greičiui. „RStudio“ turi keletą išteklių, jei norite sužinoti, kaip pagreitinti „Shiny“ programas.

Kuo tai skiriasi nuo „tikrosios“ „Shiny“ programos?

Šis itin įkrautas „Shiny R Markdown“ dokumentas skiriasi nuo visavertės „Shiny“ programos keliais pagrindiniais būdais.

1. „Shiny“ programa turi būti viename faile, vadinamame „app.R“, arba dviejuose failuose „ui.R“ ir „server.R“. Programa gali šaltinis papildomų failų su kitais pavadinimais, tačiau ta failų pavadinimų struktūra yra absoliuti. Vieno failo programoje „R.R“ reikia skyrių, skirtų naudotojo sąsajai (vartotojo sąsaja, apibrėžianti, ką vartotojas mato ir su kuo sąveikauja) ir serveriui.

2. Blizgūs programų išdėstymai yra pastatyti aplink „Bootstrap“ puslapio tinklelio struktūrą. Daugiau apie maketo struktūrą galite pamatyti „RStudio“ programos „Shiny“ maketo vadove.

3. Daugelis dinaminių komponentų, kuriuos norite pateikti, įskaitant tokius kaip diagramos ir lentelės, turi būti specialiai patalpintas kažkur puslapyje su papildomomis išvesties funkcijomis ir apibrėžimais. Pvz., Interaktyviam lankstinukų žemėlapiui reikėtų tokio kodo kaip informacinis lapelis „Output“ („mymap“) kur nors vartotojo sąsajoje pasakyti programai, kur ji turėtų būti rodoma, be serverio kodo, pvz

output $ mymap <- renderLeaflet ({#ŽEMĖLAPIO KODAS ČIA})

apibrėžti žemėlapio generavimo logiką.

Čia yra „Shiny app.R“ šios programos histogramos ir lentelės failo pavyzdys:

biblioteka („blizgi“)

biblioteka („dplyr“)

biblioteka („ggplot2“)

biblioteka („DT“)

parinktys (scipen = 999)

įkelti ("mamarkdowndata.rdata") # įkelia kintamuosius žymėjimo duomenis

ma_appdata_for_map <- skaitykite RDS ("zip_mass_appdata_for_map.rds")

# Apibrėžkite vartotojo sąsają

ui <- fluidPage (

# Paraiškos pavadinimas

titlePanel („Pajamų ir būsto išlaidos pagal pašto kodą“),

# Šoninė juosta

šoninė juosta Maketas (

šoninė juosta

selectInput („mycities“, „Pasirinkite 1 ar daugiau vietų Masačusetse:“, pasirinkimai = c („All Mass“, rūšiavimas (unikalus (markdowndata $ City))), keli = TRUE, pasirinktas = „Boston“),

br (),

stiprus ("Pastaba: kai kuriuose miestuose pašto kodai gali turėti daugiau nei vieną vietos pavadinimą. Pavyzdžiui, Allstonas, Braitonas, Dorčesteris ir keletas kitų rajonų neįtraukiami į pašto kodo vietovės pavadinimą \" Bostonas \ ".")

),

# Rodyti histogramą

mainPanel (

h4 (htmlOutput ("histogramHeadline")),

plotOutput („myhistograma“),

br (),

h4 („htmlOutput“ („tableHeadline“)),

DTOutput („mytable“)

)

)

)

# Apibrėžkite serverio logiką, reikalingą histogramai parengti

serveris <- funkcija (įvestis, išvestis) {

mydata <- reaktyvus ({

if („Visos masės“%%% $ $ mycities) {

markdowndata

} Kitas {

filtras (žymėjimo duomenys, miesto%% input $ mycities)

}

})

selected_places <- reaktyvus ({

if („Visos masės“%%% $ $ mycities) {

„Masačusetsas“

} Kitas {

įklijuoti (įveskite $ mycities,

sep = "", sutraukti = ",")

}

})

išvestis $ histogramHeadline <- renderUI ({

įklijuoti („Histograma“, „selected_places“), „pajamų duomenys“)

})

output $ tableHeadline <- renderUI ({

įklijuoti („Data for“, selected_places ())

})

išvestis $ myhistogram <- renderPlot ({

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

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

theme_classic () +

xlab ("") +

ylab ("") +

scale_x_continuous (etiketės = doleris)

})

išvestis $ mytable <- renderDT ({

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

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

formatCurrency (6, valiuta = "", skaitmenys = 0)

})

}

# Paleiskite programą

„shinyApp“ (ui = ui, serveris = serveris)

Daugiau apie tokių „Shiny“ programų kūrimą galite sužinoti „RStudio“ „Shiny“ įvadinėse pamokose.

Norėdami gauti daugiau „R“ patarimų, eikite į „Do More With R“ vaizdo įrašo puslapį arba „YouTube“ grojaraštį „Do More With R“.