Programmēšana

Pārvērtiet R Markdown dokumentu par interaktīvu pieredzi

R Markdown ir viena no manām iecienītākajām lietām par mūsdienu R. Tas piedāvā vienkāršu veidu, kā apvienot tekstu, R kodu un R koda rezultātus vienā dokumentā. Kad šis dokuments tiek atveidots kā HTML, varat pievienot kādu lietotāja mijiedarbību ar HTML logrīkiem, piemēram, DT tabulām vai brošūru kartēm. (Ja neesat pazīstams ar R Markdown, vispirms varat apskatīt manu R Markdown video pamācību un pēc tam atgriezties šeit.)

Bet jūs, iespējams, nezināt, ka ir veids, kā vēl vairāk uzlabot R Markdown interaktivitāti: pievienojot izpildlaiks: spīdīgs uz dokumenta galveni.

Shiny ir tīmekļa lietojumprogrammu ietvars R. Kā ietvaram tam ir diezgan specifiska struktūra. Tomēr jūs varat pārveidot R Markdown dokumentu par Shiny lietotni bez stingras struktūras ievērošanas. Tā vietā jūs varat uzreiz pāriet un sākt kodēšanu - neuztraucoties par dažiem tipiskiem Shiny uzdevumiem, piemēram, nodrošinot visu iekavu un komatu pareizību dziļi ligzdotu izkārtojuma funkciju ietvaros.

Pat ja jūs esat pieredzējis spīdīgs izstrādātājs, R Markdown dokuments joprojām var būt noderīgs spīdīgiem uzdevumiem, kur jums nav nepieciešama pilnvērtīga lietojumprogramma, vai ātri izmēģināt kodu. Tam joprojām būs nepieciešams Shiny serveris, taču, ja jums ir instalēta RStudio un spīdīgā pakete, jums jau ir viens no tiem lokāli.

Apskatīsim, kā Runtdown darbojas runtime shiny.

1. Pamata R atzīme

Es sākšu ar parastu, bez Shiny R Markdown dokumentu, kurā ir meklējama datu tabula pēc Masačūsetsas pasta indeksa. Lietotāji var meklēt vai kārtot pēc jebkuras tabulas kolonnas, atbildot uz tādiem jautājumiem kā “Kuriem pasta kodiem ir visaugstākie vidējie mājsaimniecības ienākumi Midleseksas apgabalā?” vai “Kādiem pasta indeksiem ir visdārgākais mēneša mājoklis?”

Šarona Mačlisa /

Šim dokumentam ir arī histogramma, kas parāda vidējo mājsaimniecības ienākumu sadalījumu un tekstu, norādot, kuriem pasta indeksiem ir visaugstākie un zemākie ienākumi. Tabula ir interaktīva, bet pārējais dokuments nav. Izveidoto HTML versiju var redzēt RStudio RPubs.

Ja vēlaties sekot līdzi, vietnē GitHub varat redzēt šī R Markdown dokumenta atsevišķās versijas kodu, ieskaitot datus. Vai arī, ja vēlaties uzzināt, kā es šos demogrāfiskos datus ieguvu R, šajā rakstā ir R kods, lai izveidotu savu datu kopu (un jūs varat pielāgot kodu, lai izvēlētos citu stāvokli). Ja izveidojat savu datu versiju, R R Markdown pamata dokumenta kods, izmantojot atsevišķu datu failu, atrodas arī vietnē GitHub.

Neatkarīgi no izvēlētā R Markdown dokumenta redzēsit, ka tas galvenokārt ir statisks dokuments ar zināmu interaktivitāti. Bet ja nu es gribētu visu dokumentu būt interaktīvam - šajā gadījumā skatiet histogrammas un teksta izmaiņas, kā arī tabulu? Kā lietotājs var izvēlēties atsevišķas pilsētas un redzēt visi informācija filtrēta, lai parādītu tikai šīm vietām?

Viens no risinājumiem ir katras pilsētas lapas ģenerēšana - iespējams, izmantojot R skriptu, ja izmantojat tā sauktos parametrizētus pārskatus. Tomēr jūs varat arī izveidot vienu R Markdown dokumentu, kas darbojas kā interaktīva lietotne.

Pievienojiet spīdīgu interaktivitāti

Lai pievienotu Shiny interaktivitāti parastajam R Markdown dokumentam, vispirms pievienojiet izpildlaiks: spīdīgs uz dokumenta YAML galveni, piemēram:

---

nosaukums: "Vidējie mājsaimniecības ienākumi pēc pasta indeksa"

izvade: html_document

izpildlaiks: spīdīgs

---

Kad esat to izdarījis un nospiedis Saglabāt, RStudio adītā ikona pārvēršas par “Palaist dokumentu”. Lai gan izvadā joprojām ir rakstīts “html_document”, tas vairs nebūs vienkāršs HTML. Tagad tā ir mini-Shiny lietojumprogramma.

Šarona Mačlisa / Sharon Machlis,

Ļaujiet lietotājiem izvēlēties datus

Tagad man ir nepieciešams veids, kā lietotāji var izvēlēties datus. Spīdīgajam tam ir vairāki ievades logrīki. Es izmantošu selectInput (), kas izveido nolaižamo sarakstu un ļauj lietotājiem izvēlēties vairāk nekā vienu vienumu. Shiny ir citi logrīki radio pogām, teksta ievadei, datuma atlasītājiem un citam. To kolekciju var apskatīt RStudio Shiny Widgets galerijā.

Manas mini lietotnes kods selectInput () nolaižamajā sarakstā ir pieci argumenti, un tas izskatās šādi:

selectInput ("mycities", "Izvēlieties vienu vai vairākas pilsētas:",

izvēles = kārtot (unikāls (markdowndata $ City)),

izvēlēts = "Boston", vairākkārt = TRUE)

Pirmais argumentsselectInput (), mycities ir mainīgā nosaukums, kuru esmu izvēlējies, lai saglabātu visas lietotāja izvēlētās vērtības. Otrais arguments ir galvenes teksts, kas parādīsies ar nolaižamo sarakstu. Trešais arguments izvēles, ir visu iespējamo nolaižamā saraksta vērtību vektors - šajā gadījumā manos datos unikālās pilsētu nosaukumu vērtības sakārtotas alfabētiskā secībā. izvēlēts = Boston nozīmē, ka nolaižamajā izvēlnē pēc noklusējuma Bostona būs izvēlētā pilsēta (noklusējuma izvēles izvēle nav obligāta). Un visbeidzot, vairākkārt = TRUE ļauj lietotājiem vienlaikus izvēlēties vairāk nekā vienu pilsētu.

Šis kods izveido nolaižamo HTML sarakstu. Ja jūs to vadāt selectInput () kodu savā R konsolē, tas ģenerēs HTML nolaižamajai izvēlnei (pieņemot, ka esat ielādējis Shiny un datu rāmi, ko sauc par kolonnas Pilsēta markdowndata).

Tālāk man jāuzraksta daži R, lai šī nolaižamā izvēlne patiešām kaut ko darītu.

Izveidojiet dinamiskos mainīgos

Es šo interaktivitātes loģiku kodēšu divās daļās:

  1. Izveidojiet datu rāmi - es to saukšu mydata- tas tiek filtrēts katru reizi, kad lietotājs izvēlas pilsētu.
  2. Uzrakstiet kodu tekstam, histogrammai un datu tabulai, kas visi mainīsies, pamatojoties uz manu dinamisko datu rāmi.

Vissvarīgākais, kas šajā brīdī jāpatur prātā, ir tas, ka šie objekti vairs nav “regulāri” R mainīgie. Viņi ir dinamisks. Viņi izmaiņas, pamatojoties uz lietotāja darbībām. Tas nozīmē, ka tie darbojas nedaudz savādāk nekā mainīgie, pie kuriem jūs, iespējams, esat pieraduši.

Kas viņos ir īpašs? Šeit ir trīs lietas, kas jums jāzina:

  1. Lai piekļūtu ievades mainīgā vērtībai, kurā tiek glabāta jūsu lietotāja informācija, nepieciešama sintakse ievadiet $ myvarname, nevis vienkārši myvarname. Tātad vērtībām, kas saglabātas mycities nolaižamajā sarakstā izmantojiet ievadiet $ mycities
  2. Arī objekti, piemēram, diagrammas un tabulas, kas ir atkarīgi no jūsu lietotāja vērtībām, ir dinamiski, un tiem jābūt reaktīviem. Tas ir tikpat vienkārši, kā iesaiņot tos īpašā funkcijā, bet jums jāatceras to darīt. Viņiem arī nevar piekļūt, izmantojot tikai viņu vārdus, taču tiem ir nepieciešamas arī iekavas: līdzīga sintakse mivars () un nē myvars.
  3. Kad jūsdisplejs dinamisks saturs - atkal tādas lietas kā tabula, karte, histogramma vai pat teksts - tas ir jāatveido īpašā veidā, parasti izmantojot kādu no Shiny īpašajām renderēšanas funkcijām. Labā ziņa ir tā, ka Shiny rūpējas par lielāko daļu izmaiņu uzraudzības un rezultātu aprēķināšanas funkcionalitātes. Jums vienkārši jāzina, kuru funkciju izmantot, un pēc tam jāiekļauj tā kodā.

Tas viss bieži ir vieglāk, nekā var izklausīties. Lūk, kā es izveidotu datu rāmi ar nosaukumu mydata kas mainās katru reizi, kad lietotājs izvēlas pilsētu ar mycities selectInput () nomest lejā :

mydata <- reaktīvs ({

filtrs (markdowndata, City%% input $ mycities)

})

The mydata objektam tagad pieder reaktīvā izteiksmeun mainīs vērtību katru reizi, kad lietotājs veic izmaiņas nolaižamajā sarakstā mycities.

Parādīt dinamiskos mainīgos

Tagad es gribētu kodēt tabulu izmantojot kas filtrēts mydata dati.

Kā jūs jau to nojaušāt, DT :: datējami (mydata) nedarbosies. Un tam ir divi iemesli.

Pirmkārt, tāpēc, ka mydata ir reaktīvs izteiciens, uz to nevar atsaukties tikai pēc nosaukuma. Pēc tā ir nepieciešamas iekavas, piemēram,mydata ().

Bet, otrkārt,DT :: datējams (mydata ()) nedarbosies arī kā atsevišķs kods. Jūs saņemsit kļūdas ziņojumu apmēram šādi:

 Darbība nav atļauta bez aktīva reaktīva konteksta.

(Jūs mēģinājāt izdarīt kaut ko tādu, ko var izdarīt tikai no iekšpuses

reaktīva izteiksme vai novērotājs.)

Sākot darbu, šī kļūdas ziņojuma versijas var redzēt diezgan bieži. Tas nozīmē, ka jūs mēģināt parādīt kaut ko dinamisku, izmantojot parasto R sintaksi.

Lai to novērstu, man vajag Spīdīgu renderēšanas funkcija. Vairākām vizualizācijas pakotnēm ir savas īpašās Shiny render funkcijas, ieskaitot DT. Tās renderēšanas funkcija ir renderDT (). Ja piebildīšu renderDT ({}) ap DT kodu un vēlreiz palaidiet dokumentu, tam vajadzētu darboties.

Šis ir mans tabulas kods:

renderDT ({

DT :: datējami (mydata (), filter = 'top')%>%

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

formatCurrency (6, valūta = "", cipari = 0)

})

Piezīme. Papildus tabulas izveidei un parādīšanai šis kods pievieno arī dažus formatējumus. 4. un 5. sleja tiek parādīta kā valūta ar dolāra zīmi un komatiem. Otrais formatCurrency () 6. kolonnas rindiņa komatus pievieno noapaļotajiem skaitļiem bez dolāra zīmes, jo kā valūtas simbolu es norādīju "".

Es varu izmantot to pašu mydata () reaktīvs datu rāmis, lai izveidotu histogrammu, izmantojot citu Shiny render funkciju: renderPlot ().

renderPlot ({

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

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

theme_classic () +

xlab ("") +

ylab ("") +

scale_x_continuous (etiķetes = dolārs)

})

Šis kods ietver arī nelielu ggplot stilu, piemēram, krāsu izvēli joslas kontūrai un aizpildīšanai un grafika motīva maiņu. Pēdējā rindiņa formatē x asi, lai pievienotu dolāra zīmes un komatus, un tam nepieciešama pakete svari.

Katram no šiem R koda blokiem jābūt R Markdown R koda fragmentā, tāpat kā jebkuram citam R koda gabalam parastajā Markdown dokumentā. Tas varētu izskatīties kaut kas līdzīgs zemāk redzamajam kodam, kurā gabals tiek nosaukts arī par “histo” (nosaukumi nav obligāti) un mana sižeta platums un augstums ir noteikts collās.

"{r histo, att. platums = 3, att. augstums = 2}

renderPlot ({

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

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

theme_classic () +

xlab ("") +

ylab ("") +

scale_x_continuous (etiķetes = dolārs)

})

```

Ja es vēlos parādīt interaktīvu tekstu, kas mainās atkarībā no lietotāja izvēles, man ir nepieciešama Shiny render funkcija, kas nosaukta - pārsteigums! -renderText (). Jūs varat to ievietot koda fragmentā vai izmantot alternatīvu R Markdown sintakses formātu ārpus koda daļām, piemēram:

Man ir vienkāršs teksts, un tad pievienoju `R R CODE TIKS NOVĒRTĒTS ŠEIT '

Šī sintakse ir viena aizmugure, pēc kuras tūlīt seko mazie burti r, atstarpe, R kods, kuru vēlaties novērtēt, un beidzas ar citu atsevišķu taustiņu. Tātad, lai histogrammai pievienotu dinamisku virsrakstu, varat izmantot šādu kodu:

Histogramma `r renderText ({input $ mycities})`

Tas lieliski darbojas vienā pilsētā. Tomēr, ja ir vairāk nekā viena pilsēta, šis kods tikai parādīs nosaukumus bez komatiem starp tiem, piemēram, Bostonas Kembridžas Amhersta. Lai iegūtu publiski pieejamu kodu, jūs vēlaties to mazliet palielināt, varbūt izmantojot bāzes R ielīmēt () funkcija:

Histogramma `r renderText ({paste (ievadiet $ mycities,

sep = "", sakļaut = ",")}) "

Varat izmantot līdzīgu kodu, lai ģenerētu tekstu, kas lietotājiem norāda pasta indeksus ar augstākajiem un zemākajiem vidējiem ienākumiem. Šiem aprēķiniem es izveidoju vienu reaktīvo datu ietvaru, kurā bija rinda ar visaugstākajiem mājsaimniecības ienākumiem, un otru ar viszemākajiem.

Es arī atklāju, ka viszemākie vidējie ienākumi bija aizdomīgi zemi - 2500 USD Amherstas koledžas pilsētas kopienā, Masačūsetā -, kur mēneša vidējās mājokļa izmaksas ir 1 215 USD. Manuprāt, tā ir studentu mājokļu koncentrācija, tāpēc es izslēdzu visus pasta indeksus, kuru vidējie mājsaimniecības ienākumi ir mazāki par 5000 ASV dolāriem.

Šeit ir kods, lai izveidotu šos divus datu rāmjus:

zip_highest_income_row <- reaktīvs ({

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

})

zip_lowest_income_row <- reaktīvs ({

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

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

})

Tam vajadzētu izskatīties kā tipiskam dplyr filtrs () kods, izņemot to, ka 1) katrs ir iesaiņots a reaktīvs ({}) funkcija un 2) mydata dinamisks datu ietvars, kas mainās, pamatojoties uz lietotāja ievadi, tiek dēvēts par mydata () nevis vienkārši mydata

Lai parādītu pirmā vienuma vērtību zip_highest_income_row datu rāmja ZIP kolonnā, es nevaru izmantot parasto R kodu, piemēramzip_highest_income_row $ Zip [1]. Tā vietā man ir jāatsaucas uz dinamisko datu rāmi ar iekavām:zip_highest_income_row () $ Zip [1] . Un tad iesaiņojiet to Spīdīgajā renderēt () funkcija - šajā gadījumā renderText ():

Pasta indekss `r renderText (zip_highest_income_row () $ ZipCode [1])`

`r renderText (zip_highest_income_row () $ pilsēta [1])"

ir visaugstākais vidējais ienākums jūsu izvēlētajā vietā (-ās),

`r renderText (svari :: dolārs (zip_highest_income_row () $ MedianHouseholdIncome [1]))".

Pasta indekss `r renderText (zip_lowest_income_row () $ ZipCode [1])`

"r renderText (zip_lowest_income_row () $ City [1])" ir viszemākais

vidējie ienākumi izvēlētajā vietā (-ās),

`r renderText (svari :: dolārs (zip_lowest_income_row () $ MedianHouseholdIncome [1]))".

Palaidiet un kopīgojiet savu Shiny lietotni

Kad esat pievienojis izpildlaiks: spīdīgs R Markdown, tas vairs nav HTML fails - tā ir mini Shiny lietojumprogramma. Un tas nozīmē, ka tā darbībai ir nepieciešams spīdīgs serveris.

Kā jau minēju iepriekš, ikvienam, kam ir R, RStudio un spīdīgā pakete, vietējā sistēmā ir spīdīgs serveris. Tas atvieglo jebkuras Shiny lietotnes koplietošanu ar citiem R lietotājiem. Jūs varat nosūtīt viņiem dokumentu pa e-pastu vai, glītāk, ievietot to tiešsaistē kā saspiestu failu un izmantot spīdīgs :: runUrl () komandu. Ir īpaši runGitHub () un runGist () funkcijas GitHub lietotņu funkcijām, kas ir ērtas, ja projektos izmantojat GitHub, kas automātiski sasitīs papildu failus jūsu projektā, piemēram, datu failus.

Bet, iespējams, kādā brīdī jūs vēlaties parādīt savu darbu lietotājiem, kas nav R, un tam nepieciešams publiski pieejams Shiny serveris. Iespējams, vienkāršākais variants ir RStudio pakalpojums shinyapps.io. Tas ir bezmaksas dažām ierobežotām publiskām lietotnēm ar ļoti nelielu lietojumu. Apmaksāto kontu cena ir atkarīga no to aktīvo stundu skaita, kuras tie piedāvā jūsu lietotnēm. Aktīvās stundas mēra laiku, kad tiek aktīvi izmantota lietojumprogramma - viena stundā viena persona ir tā pati stunda, kurā šajā stundā ir 100 cilvēki. Lai nodrošinātu 24x7 darbības laiku dažām lietotnēm, jums būs nepieciešams standarta konts 1100 ASV dolāri gadā ar 2000 stundām.

Varat arī izveidot savu Shiny serveri uz mākoņa pakalpojuma, piemēram, AWS un instalācijām R un RStudio's Shiny servera programmatūras bezmaksas versijai. Dean Attali piedāvā lielisku soli pa solim apmācību, kurā parādīts, kā to izdarīt Digitālajā okeānā, kur jūs varat izveidot un palaist nelielu Shiny serveri tikai 5 USD mēnesī par mitināšanas izmaksām, neuztraucoties par aktīvajām stundām. Kompromiss veic savus ielāpus un R / bibliotēkas atjauninājumus - un, iespējams, robustām lietojumprogrammām jums var būt nepieciešams augstāks virtuālais serveris nekā lētākais 1G piliens.

Pievienojiet interaktīvu karti

Visbeidzot, es jūs iepazīstināšu ar to, kā es pievienoju interaktīvu karti šim dokumentam, izmantojot brošūru paketi.

Pirmkārt, jums ir nepieciešams fails ar ģeotelpiskiem, kā arī skaitliskiem datiem, lai jūsu lietotne zinātu katra pasta indeksa formu. Zemāk esošajā kodā ir paskaidrots, kā izveidot telpisko datu rāmi, izmantojot tidycensus un sf paketes.

Interaktivitātei es izveidošu šo telpisko datu dinamisko versiju, tāpēc kartē tiek rādītas tikai atlasītās pilsētas. Zemāk ir mans kods, kā to darīt. Tas var izskatīties nedaudz atkārtojas, bet es izvēlos lasāmību, nevis īsumu. Sazinieties ar savu versiju.

mapdata <- reaktīvs ({

if ("Visas masas"%% input $ mycities) {

ma_appdata_for_map%>%

dplyr :: select (ZipCode = GEOID, MedianHouseholdIncome = medincome, MedianMonthlyHousingCost = medmonthlyhousingcost, Population = pop, City, County = county.name, State, Lat, Long, ienākumi, mājokļi, Pop, ģeometrija)%>%

mutēt (

Izcelts = "Jā"

) %>%

sf :: st_as_sf ()

} cits

dplyr :: filtrs (ma_appdata_for_map, pilsēta%% input $ mycities)%>%

dplyr :: select (ZipCode = GEOID, MedianHouseholdIncome = medincome, MedianMonthlyHousingCost = medmonthlyhousingcost, Population = pop, City, County = county.name, State, Lat, Long, ienākumi, mājokļi, Pop, ģeometrija)%>%

dplyr :: mutate (

Izcelts = ifelse (pilsēta%% input $ mycities, "Jā", "Nē")

) %>%

sf :: st_as_sf ()

}

})

Reaktīvajai funkcijai jau jābūt pazīstamai. Mans ja un cits paziņojumos tiek ņemts vērā, vai lietotājs ir izvēlējies All Mass vai tikai atsevišķas pilsētas. Jebkurai izvēlei, izņemot visu masu, es filtrēju tikai atlasītās pilsētas. Abos gadījumos es izmantoju parasto dplyr select () Lai izvēlētos, kuras kolonnas vēlaties kartē, noteikti iekļaujiet Lat platumam, Long garumam un ģeometriju, kas satur ZIP koda daudzstūra formas failus. Pēdējā rinda katrā ja () koda sadaļa pārliecinās, ka rezultāti ir sf (vienkāršas funkcijas) ģeotelpiskais objekts. Lai gan man vietējā Mac nebija vajadzīgs šis kods, lietotne strādāja labāk vietnē shinyapps.io, kad to iekļāvu.

Tagad ir pienācis laiks strādāt ar kartes krāsām. Es savai brošūru kartei izveidošu divas reaktīvas krāsu paletes, vienu ienākumiem un otru mājokļa izmaksām. Abos gadījumos es izmantoju zaļumus, bet jūs varat izvēlēties jebkuru, kuru vēlaties.

incomepal <- reaktīvs ({

brošūra :: colorNumeric (palete = "Zaļie",

domain = mapdata () $ MedianHouseholdIncome)

})

housingpal <- reaktīvs ({

brošūra :: colorNumeric (palete = "Zaļie",

domain = mapdata () $ MedianMonthlyHousingCost)

})

Es vēlos, lai arī tie būtu reaktīvi, tāpēc tie mainās, pamatojoties uz lietotāju izvēli. Domēna arguments nosaka vērtības, kuras palete parādīs. Pirmajā gadījumā tā ir mana reaktīvā mapdata objekta kolonna MedianHouseholdIncome - ar mapdata kodu mapdata () tā kā tas ir reaktīvs; otrajā gadījumā tā ir sleja MedianMonthlyHousingCost.

Es arī iestatīšu tieši to, kā es vēlos, lai parādās uznirstošais teksts. Tam var būt nepieciešams HTML maisījums (

ir HTML rindas pārtraukums) un datu rāmja kolonnas. Lai gan jūs noteikti varat izmantot bāzes R ielīmēt () vai paste0 () funkcijas, es uzskatu, ka līmes pakete ir daudz vienkāršāka, ja tiek izmantots vairāk nekā viens mainīgais, kas sajaukts ar tekstu. Zemāk jūs varat redzēt, ka man vienkārši jāpievieno mainīgie, kurus es vēlos novērtēt cirtainajās iekavās. Protams, uznirstošajam tekstam ir jābūt arī reaģējošam, tāpēc arī tas mainās atkarībā no lietotāja izvēles.

mypopups <- reaktīvs ({

līme :: līme ("Pasta indekss: {mapdata () $ ZipCode}

Vidējie mājsaimniecības ienākumi: {mapdata () $ ienākumi}

Vidējās mēneša mājokļa izmaksas: {mapdata () $ housing}

Iedzīvotāji: {mapdata () $ Pop}

Pilsēta: {mapdata () $ City}

Apgabals: {mapdata () $ apgabals} ")

})

Visbeidzot, kods pašai brošūru kartei.

brošūra :: renderLeaflet ({

brošūra (mapdata ())%>%

addProviderTiles ("CartoDB.Positron")%>%

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

fillOpacity = 0,7,

svars = 1,0,

krāsa = "melna",

smoothFactor = 0,2,

popup = mypopups (),

group = "Mājsaimniecības ienākumi"

) %>%

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

fillOpacity = 0,7,

svars = 0,2,

krāsa = "melna",

smoothFactor = 0,2,

popup = mypopups (),

group = "Mājokļa izmaksas"

) %>%

addLayersControl (

baseGroups = c ("Mājsaimniecības ienākumi", "Mājokļa izmaksas"),

position = "bottomleft",

options = layerControlOptions (sakļauts = FALSE)

)

})

renderLapiņa () ir funkcija Shiny render, kas parādīs dinamisko dataviz, paļaujoties uz dinamisko mapdata objektu. Šīs funkcijas iekšpusē ir "parasts" skrejlapu kartēšanas kods. Pirmā rinda, brošūra (mapdata ()), no reaktīvā mapdata objekta izveido R brošūras objektu. Tas izmanto skrejlapu paketi, kas ir R iesaiņojums bibliotēkai leaflet.js. Nākamajā rindā tiek pievienots CartoDB fona karšu flīžu stils.

The addPolygons () Funkcija instrukcijai norāda, kā parādīt pasta indeksa daudzstūrus. Es gribu, lai to iekrāso kolonna MideanHouseholdIncome, izmantojot ienākumu paleti, kuru es izveidoju agrāk, incomepal. Lielākā daļa pārējo šo argumentu ir stils. The uznirstošais logs arguments nosaka uznirstošo tekstu kā mypopups objekts, kuru es izveidoju agrāk, un grupas arguments piešķir nosaukumu kartes slānim.

Es pievienoju vēl vienu līdzīgu slāni vidējām ikmēneša mājokļa izmaksām. Un, visbeidzot, addLayersControl () katram slānim apakšējā kreisajā stūrī ievieto klikšķināmu leģendu.

Šarona Mačlisa /

Ja vēlaties uzzināt vairāk par kartēšanu R ar skrejlapu, skatiet manu apmācību “Karšu izveide R ar 10 (diezgan) vienkāršiem soļiem”.

Galīgais R iezīmēšanas fails

Galīgo R Markdown failu var redzēt vietnē GitHub. Rūpīgi apskatot kodu, jūs varat pamanīt dažus papildinājumus. Es pievienoju visu masu selectInput () nolaižamā saraksta izvēles vektors, tāpēc kods tagad ir

selectInput ("mycities", "Izvēlieties vienu vai vairākas pilsētas:",

izvēles = c ("Visa masa", kārtot (unikāls (markdowndata $ City))),

vairākkārt = TRUE, izvēlēts = "Boston")

Un pēc tam es pārveidoju vairākas citas koda rindas, lai dotu atšķirīgu iespēju, ja ir atlasīta Visa masa, piemēram, izveidoju dinamisku mainīgo selected_places, kurā būs teikts "Massachusetts", ja "All Mass" ir viena no izvēlētajām pilsētām.

selected_places <- reaktīvs ({

if ("Visas masas"%% input $ mycities) {

"Masačūsetsa"

} cits

ielīmēt (ievadiet $ mycities,

sep = "", sakļaut = ",")

}

})

Ņemiet vērā arī jauno YAML galveni:

---

nosaukums: "Vidējie mājsaimniecības ienākumi pēc pasta indeksa"

izvade: html_document

resursu_faili:

- mamarkdowndata.rdata

- zip_mass_appdata_for_map.rds

izpildlaiks: spīdīgs

---

Tasresources_files: opcija saka, ka šī dokumenta izpildei nepieciešami vēl divi faili, mamarkdowndata.rdata un zip_mass_appdata_for_map.rds. Tas ļauj shinyapps.io zināt, ka šie faili ir jāaugšupielādē kopā ar galveno R Markdown dokumentu, izvietojot failu arrsconnect :: deployDoc ("docname.Rmd").

Šo interaktīvo R Markdown dokumentu ar Shiny darbībā varat skatīt vietnē //idgrapps.shinyapps.io/runtimeshiny/. Ielāde var aizņemt nedaudz laika, jo es nemēģināju optimizēt šo kodu ātrumam. RStudio ir daži resursi, ja vēlaties uzzināt par Shiny lietotņu paātrināšanu.

Kā tas atšķiras no “īstas” Spīdīgas lietotnes?

Šis īpaši uzlādētais ar Shiny R Markdown dokuments atšķiras no pilnvērtīgas lietotnes Shiny dažos galvenajos veidos.

1. Spīdīgajai lietotnei jābūt vienā failā ar nosaukumu app.R vai divos failos ui.R un server.R. Lietotne var avots papildu faili ar citiem nosaukumiem, taču šī failu nosaukšanas struktūra ir absolūta. Viena faila lietotnē.R ir sadaļas, kas nepieciešamas lietotāja interfeisam (lietotāja interfeiss, kas nosaka to, ko lietotājs redz un mijiedarbojas) un serverim.

2. Spīdīgi lietotņu izkārtojumi ir veidoti ap Bootstrap lapu režģa ietvaru. Vairāk par izkārtojuma struktūru varat uzzināt RStudio Shiny lietojumprogrammu izkārtojuma ceļvedī.

3. Jābūt lielākajai daļai dinamisko komponentu, kurus vēlaties renderēt, tostarp tādām lietām kā diagrammas un tabulas īpaši ievietots kaut kur lapā ar papildu izvades funkcijām un definīcijām. Piemēram, interaktīvai brošūru kartei būtu nepieciešams kods, piemēram, brošūraOutput ("mymap") kaut kur lietotāja saskarnē, lai paziņotu lietotnei, kur tā būtu jāparāda, papildus servera kodam, piemēram,

output $ mymap <- renderLeaflet ({#KARTES KODS ŠEIT})

lai definētu kartes ģenerēšanas loģiku.

Šeit ir Shiny app.R faila piemērs šīs lietotnes histogrammai un tabulai:

bibliotēka ("spīdīga")

bibliotēka ("dplyr")

bibliotēka ("ggplot2")

bibliotēka ("DT")

opcijas (scipen = 999)

ielādēt ("mamarkdowndata.rdata") # ielādē mainīgos markdowndata

ma_appdata_for_map <- lasīt RDS ("zip_mass_appdata_for_map.rds")

# Definējiet lietotāja interfeisu

ui <- fluidPage (

# Pieteikuma nosaukums

titlePanel ("Ienākumu un mājokļu izmaksas pēc pasta indeksa"),

# Sānjosla

sānjoslaLayout (

sānjoslaPanel (

selectInput ("mycities", "Izvēlieties vienu vai vairākas vietas Masačūsetsas štatā":

br (),

spēcīgs ("Piezīme: dažās pilsētās pasta indeksiem var būt vairāki vietvārdi. Piemēram, Allston, Brighton, Dorchester un vairākas citas apkaimes nav iekļautas pasta indeksa vietas nosaukumā \" Boston \ ".")

),

# Rādīt histogrammu

mainPanel (

h4 (htmlOutput ("histogramHeadline")),

plotOutput ("myhistogram"),

br (),

h4 (htmlOutput ("tableHeadline")),

DTOutput ("maināms")

)

)

)

# Definējiet servera loģiku, kas nepieciešama histogrammas uzzīmēšanai

serveris <- funkcija (ievade, izvade) {

mydata <- reaktīvs ({

if ("Visas masas"%% input $ mycities) {

markdowndata

} cits

filtrs (markdowndata, City%% input $ mycities)

}

})

selected_places <- reaktīvs ({

if ("Visas masas"%% input $ mycities) {

"Masačūsetsa"

} cits

ielīmēt (ievadiet $ mycities,

sep = "", sakļaut = ",")

}

})

izvadīt $ histogramHeadline <- renderUI ({

ielīmēt ("Histogramma", selected_places (), "ienākumu dati")

})

output $ tableHeadline <- renderUI ({

ielīmēt ("Dati par", selected_places ())

})

izvadīt $ myhistogram <- renderPlot ({

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

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

theme_classic () +

xlab ("") +

ylab ("") +

scale_x_continuous (etiķetes = dolārs)

})

izvade $ mytable <- renderDT ({

DT :: datējami (mydata (), filter = 'top')%>%

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

formatCurrency (6, valūta = "", cipari = 0)

})

}

# Palaidiet lietojumprogrammu

shinyApp (ui = ui, serveris = serveris)

Jūs varat uzzināt vairāk par šāda veida Shiny lietotņu veidošanu RStudio's Shiny intro apmācībās.

Lai iegūtu vairāk R padomu, dodieties uz videoklipu Do More With R vai YouTube atskaņošanas sarakstā Do More With R.