Ohjelmointi

Muuta R Markdown -asiakirja interaktiiviseksi kokemukseksi

R Markdown on yksi suosikkini nykyaikaisesta R: stä. Se tarjoaa helpon tavan yhdistää teksti, R-koodi ja R-koodin tulokset yhteen asiakirjaan. Ja kun tämä asiakirja renderoidaan HTML-muodossa, voit lisätä käyttäjän vuorovaikutusta HTML-widgettien kanssa, kuten DT taulukoissa tai esite karttoja varten. (Jos et ole perehtynyt R Markdowniin, voit ensin tarkistaa R Markdown -video-opetusohjelmani ja palata sitten tänne.)

Mutta et ehkä tiedä, että R Markdown -vuorovaikutteisuutta voidaan lisätä entisestään: lisäämällä ajonaika: kiiltävä asiakirjan otsikkoon.

Shiny on R: n verkkosovelluskehys. Kehyksenä sillä on melko spesifinen rakenne. Voit kuitenkin muuntaa R Markdown -asiakirjan Shiny-sovellukseksi tarvitsematta noudattaa paljon tuosta jäykästä rakenteesta. Sen sijaan voit hypätä suoraan sisään ja aloittaa koodauksen - huolimatta joistakin tyypillisistä Shiny-tehtävistä, kuten siitä, että kaikki sulut ja pilkut ovat oikein syvälle sisäkkäin asetettujen toimintojen sisällä.

Itse asiassa, vaikka olisit kokenut kiiltävä kehittäjä, R Markdown -asiakirja voi silti olla hyödyllinen kiiltävissä tehtävissä, joissa et tarvitse täysimittaista sovellusta, tai nopeasti kokeilemaan koodia. Se tarvitsee edelleen Shiny-palvelimen, mutta jos sinulla on RStudio ja kiiltävä paketti asennettuna, sinulla on jo yksi niistä paikallisesti.

Katsotaanpa, kuinka ajonaikainen kiiltävä toimii R Markdownissa.

1. Perus R Markdown

Aloitan tavallisella, ei-kiiltävällä R Markdown -asiakirjalla, jossa on etsittävä taulukko Massachusettsin postinumeron mukaan. Käyttäjät voivat hakea tai lajitella minkä tahansa taulukon sarakkeen mukaan ja vastata kysymyksiin, kuten "Millä postinumeroilla on korkeimmat kotitalouden keskitulot Middlesexin piirikunnassa?" tai "Mitkä postinumerot ovat kalliimpia kuukausittaisia ​​asuntoja?"

Sharon Machlis /

Tässä asiakirjassa on myös histogrammi, joka näyttää kotitalouksien mediaanitulojen jakauman ja tekstin, jossa ilmoitetaan, mitkä postinumerot ovat korkeimmat ja pienimmät tulot. Taulukko on interaktiivinen, mutta muu asiakirja ei ole. Voit näyttää renderoidun HTML-version RStudion RPub-tiedostoista.

Jos haluat seurata mukana, näet tämän R Markdown -asiakirjan erillisen version koodin - mukaan lukien tiedot - GitHubissa. Tai jos haluat nähdä, miten sain nämä väestötiedot R: ään, tässä artikkelissa on R-koodi oman tietojoukon luomiseen (ja voit säätää koodia toisen tilan valitsemiseksi). Jos luot oman version tiedoista, myös R Markdown -asiakirjan koodi erillistä tiedostoa käyttäen on GitHubissa.

Kumman tahansa R Markdown -asiakirjan valitsetkin, huomaat, että se on pääasiassa staattinen asiakirja, jolla on jonkin verran vuorovaikutteisuutta. Mutta entä jos haluaisin koko dokumentti olla vuorovaikutteinen - näet tässä tapauksessa histogrammin ja tekstin muutoksen sekä taulukon? Kuinka käyttäjä voi valita yksittäiset kaupungit ja nähdä kaikki suodatetut tiedot näytetään vain kyseisille paikoille?

Yksi ratkaisu on luoda sivu kutakin kaupunkia varten - mahdollista R-komentosarjalla, jos käytät ns. Parametrisoituja raportteja. Voit kuitenkin luoda myös yhden R Markdown -asiakirjan, joka toimii kuten interaktiivinen sovellus.

Lisää kiiltävä vuorovaikutteisuus

Voit lisätä kiiltävän vuorovaikutteisuuden tavalliseen R Markdown -asiakirjaan aloittamalla lisäämällä ajonaika: kiiltävä asiakirjan YAML-otsikkoon, kuten:

---

otsikko: "Kotitalouksien mediaanitulot postinumeron mukaan"

output: html_document

ajonaika: kiiltävä

---

Kun olet tehnyt sen ja painanut Tallenna, RStudion neulekuvake muuttuu "Suorita asiakirja". Vaikka ulostulossa lukee edelleen "html_document", se ei ole enää pelkkä HTML. Se on nyt mini-Shiny-sovellus.

Sharon Machlis / Sharon Machlis,

Anna käyttäjien tehdä datavalintoja

Tarvitsen nyt tavan, jolla käyttäjät voivat tehdä tietovalintansa. Shinyllä on tätä varten useita "syöttöwidgettejä". Käytän selectInput (), joka luo avattavan luettelon ja antaa käyttäjien valita useamman kuin yhden kohteen. Shinyllä on muita widgetejä radiopainikkeille, tekstinsyöttöille, päivämäärän valitsimille ja muulle. Näet kokoelman heistä RStudion Shiny Widget -galleriassa.

Minisovellukseni koodi selectInput () avattavassa luettelossa on viisi argumenttia ja se näyttää tältä:

selectInput ("mycities", "Valitse yksi tai useampi kaupunki:",

valinnat = lajittelu (yksilöllinen (markdowndata $ City)),

valittu = "Boston", useita = TOSI)

Ensimmäinen argumenttiselectInput (), mycities on muuttujan nimi, jonka olen valinnut tallentamaan käyttäjän valitsemat arvot. Toinen argumentti on otsikkoteksti, joka näkyy avattavassa luettelossa. Kolmas väite, valintoja, on vektori kaikista mahdollisista arvoista avattavassa luettelossa - tässä tapauksessa tietoissani olevat kaupunkien nimien yksilölliset arvot aakkosjärjestyksessä. valittu = Boston tarkoittaa, että pudotusvalikko on oletusarvoisesti se, että Boston on valittu kaupunki (oletusvalinnan valinta on valinnainen). Ja lopuksi, moninkertainen = TOSI antaa käyttäjien valita useamman kuin yhden kaupungin kerrallaan.

Tämä koodi luo avattavan HTML-luettelon. Jos suoritat sen selectInput () koodia R-konsolissasi, se luo HTML-koodin avattavaan valikkoon (olettaen, että sinulla on Shiny ladattu ja datakehys, jota kutsutaan markdowndata City -sarakkeeseen).

Seuraavaksi minun täytyy kirjoittaa R, jotta tämä pudotusvalikko todella tekee jotain.

Luo dynaamisia muuttujia

Koodaan tämän interaktiivisuuslogiikan kahteen osaan:

  1. Luo tietokehys - kutsun sitä mydata—Suodatetaan aina, kun käyttäjä valitsee kaupungin.
  2. Kirjoita koodi tekstille, histogrammille ja tietotaulukolle, jotka kaikki muuttuvat dynaamisen tietokehyksen perusteella.

Tärkein asia tässä mielessä on, että nämä objektit eivät ole enää "tavallisia" R-muuttujia. He ovat dynaaminen. Ne muutos käyttäjän toimien perusteella. Ja se tarkoittaa, että ne toimivat hieman eri tavalla kuin muuttujat, joihin olet todennäköisesti tottunut.

Mitä erityistä heillä on? Tässä on kolme asiaa, jotka sinun on tiedettävä:

  1. Tarvitset syntaksin, jotta voit käyttää syötemuuttujan arvoa, joka tallentaa tietoja käyttäjältäsi kirjoita $ myvarname, ei yksinkertaisesti myvarname. Joten, arvoihin tallennetaan mycities avattava luettelo, käytä syötä $ mycities
  2. Objektit, kuten kaaviot ja taulukot, jotka riippuvat käyttäjän arvoista, ovat myös dynaamisia ja niiden on oltava reaktiivisia. Se on yhtä helppoa kuin kääriä ne erityiseen toimintoon, mutta sinun täytyy muistaa tehdä se. Niihin ei myöskään pääse vain heidän nimensä perusteella, mutta ne edellyttävät myös sulkeita: syntaksia myvar () ja ei myvar.
  3. Kun sinänäyttö dynaaminen sisältö - jälleen kerran, kuten taulukko, kartta, histogrammi tai jopa teksti - se on renderöitävä erityisellä tavalla, yleensä käyttämällä jotain Shinyn erityisistä renderöintitoiminnoista. Hyvä uutinen on, että Shiny huolehtii suurimmasta osasta muutosten seurannan ja tulosten laskemisen toiminnallisuutta. Sinun tarvitsee vain tietää mitä toimintoa käyttää, ja sisällyttää se sitten koodiin.

Tämä kaikki on usein helpompaa kuin se saattaa kuulostaa. Näin luon datakehyksen nimeltä mydata joka muuttuu joka kerta, kun käyttäjä valitsee kaupungin mycities selectInput () pudota alas :

mydata <- reaktiivinen ({

suodatin (markdowndata, kaupunki%% input $ mycities)

})

mydata esineellä on nyt a reaktiivinen ilmentyminenja muuttaa arvoa joka kerta, kun käyttäjä tekee muutoksen pudotusvalikossa mycities.

Näytä dynaamiset muuttujat

Nyt haluaisin koodata taulukon käyttämällä joka suodatettiin mydata tiedot.

Kuten olet ehkä arvannut tähän mennessä, DT :: datatable (mydata) ei toimi. Ja on kaksi syytä.

Ensinnäkin siksi mydata on reaktiivinen lauseke, et voi viitata siihen pelkällä nimellä. Se tarvitsee sen jälkeen sulkeita, kutenmydata ().

Mutta toiseksi,DT :: datatable (mydata ()) eivät toimi myöskään erillisenä koodina. Saat virhesanoman tältä:

 Toimintaa ei sallita ilman aktiivista reaktiivista kontekstia.

(Yritit tehdä jotain, joka voidaan tehdä vain sisältäpäin

reaktiivinen ilme tai tarkkailija.)

Saatat nähdä tämän virheilmoituksen versiot melko usein aloittaessasi. Se tarkoittaa, että yrität näyttää jotain dynaamista tavanomaisella R-syntaksilla.

Tämän korjaamiseksi tarvitsen kiiltävän renderöintitoiminto. Monilla visualisointipaketeilla on omat erityiset Shiny render -toiminnot, mukaan lukien DT. Sen renderöintitoiminto on renderDT (). Jos lisää renderDT ({}) DT-koodin ympärillä ja aja asiakirja uudelleen, sen pitäisi toimia.

Tämä on taulukon koodi:

renderDT ({

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

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

formatCurrency (6, valuutta = "", numerot = 0)

})

Huomaa: Taulukon luomisen ja näyttämisen lisäksi tämä koodi lisää myös muotoilun. Sarakkeet 4 ja 5 näkyvät valuuttana, dollarin merkki ja pilkut. Toinen formatCurrency () sarakkeen 6 rivi lisää pilkut pyöristettyihin numeroihin ilman dollarin merkkiä, koska määritin valuuttasymboliksi "".

Voin käyttää samaa mydata () reaktiivinen datakehys histogrammin luomiseksi käyttämällä toista Shiny render -toimintoa: renderPlot ().

renderPlot ({

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

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

teema_klassikko () +

xlab ("") +

ylab ("") +

scale_x_continuous (tunnisteet = dollari)

})

Tämä koodi sisältää myös pienen ggplot-tyylin, kuten värien valitseminen palkin ääriviivoille ja täytölle sekä kaavion teeman muuttaminen. Viimeinen rivi muotoilee x-akselin dollarin merkkien ja pilkkujen lisäämiseksi, ja se vaatii asteikkopaketin.

Jokaisen näistä R-koodilohkoista on oltava R Markdown R -koodinpaloissa, aivan kuten kaikki muutkin tavanomaisessa Markdown-asiakirjassa olevat R-koodipalat. Se voisi näyttää jotain alla olevalta koodilta, joka myös nimittää palan "histoksi" (nimet ovat valinnaisia) ja asettaa juoni leveyden ja korkeuden tuumina.

`` {r histo, kuvan leveys = 3, kuvan korkeus = 2}

renderPlot ({

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

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

teema_klassikko () +

xlab ("") +

ylab ("") +

scale_x_continuous (tunnisteet = dollari)

})

```

Jos haluan näyttää vuorovaikutteista tekstiä, joka muuttuu käyttäjän valinnan mukaan, tarvitsen Shiny render -toiminnon, joka on nimeltään - yllätys! -renderText (). Voit laittaa sen koodipalaan tai käyttää vaihtoehtoista R Markdown -syntaksimuotoa koodipalojen ulkopuolella näin:

Minulla on vain tekstiä ja lisää sitten `r R KOODI ARVIOITU TÄSTÄ

Tämän syntaksissa on yksi taustamerkki, jota seuraa välittömästi pienet kirjaimet r, välilyönti, arvioitava R-koodi ja päättyen toiseen yksittäiseen taustamerkkiin. Joten voit lisätä dynaamisen otsikon histogrammiin käyttämällä seuraavaa koodia:

Histogrammi `r renderText ({input $ mycities}) '

Tämä toimii hyvin yhdessä kaupungissa. Jos kuitenkin on enemmän kuin yksi kaupunki, kyseinen koodi näyttää vain nimet ilman pilkkuja niiden välillä, kuten Boston Cambridge Amherst. Julkista koodia varten haluaisit kaunistaa sen hieman, ehkä käyttämällä perus-R: itä liitä () toiminto:

Histogrammi `r renderText ({paste (kirjoita $ mycities,

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

Voit käyttää vastaavaa koodia sellaisen tekstin luomiseen, joka kertoo käyttäjille postinumerot, joiden mediaanitulot ovat suurimmat ja pienimmät. Näitä laskelmia varten loin yhden reaktiivisen tietokehyksen, joka sisälsi rivin, jolla oli korkeimmat kotitalouden tulot, ja toisen, jolla oli pienimmät kotitalouden tulot.

Huomasin myös, että alhaisimmat mediaanitulot olivat epäilyttävän pienet - 2 500 dollaria Amherstin yliopistossa Massachusettsissa sijaitsevassa korkeakoulukaupungin yhteisössä, jossa mediaanikuukausikulut kuukaudessa ovat 1 215 dollaria. Oletan, että se on opiskelija-asuntojen keskittymä, joten jätin pois kaikki postinumerot, joiden kotitalouden mediaanitulot ovat alle 5000 dollaria.

Tässä on koodi näiden kahden datakehyksen luomiseksi:

zip_highest_income_row <- reaktiivinen ({

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

})

zip_lowest_income_row <- reaktiivinen ({

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

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

})

Tämän pitäisi näyttää tyypilliseltä dplyrin suodatin () paitsi, että 1) jokainen on kääritty a reaktiivinen ({}) toiminto ja 2) mydata dynaamista datakehystä, joka muuttuu käyttäjän syötteen perusteella, kutsutaan nimellä mydata () eikä vain mydata

Näytä ensimmäisen kohteen arvo zip_highest_income_row datakehyksen ZIP-sarake, en voi käyttää tavallista R-koodia, kutenzip_highest_income_row $ Zip [1]. Sen sijaan minun on viitattava dynaamiseen datakehykseen suluilla:zip_highest_income_row () $ Zip [1] . Ja sitten kääri se kiiltävään tehdä () funktio - tässä tapauksessa renderText ():

Postinumero `r renderText (zip_highest_income_row () $ ZipCode [1])`

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

on korkein mediaanitulo valitsemassasi paikassa tai paikoissa,

`r renderText (asteikot :: dollari (zip_highest_income_row () $ MedianHouseholdIncome [1])) '.

Postinumero "r renderText (zip_lowest_income_row () $ ZipCode [1])"

`r renderText (zip_lowest_income_row () $ Kaupunki [1])` on pienin

mediaanitulot valitsemassasi paikassa (paikoissa),

`r renderText (asteikot :: dollari (zip_lowest_income_row () $ MedianHouseholdIncome [1])) '.

Suorita ja jaa Shiny-sovelluksesi

Kun lisäät ajonaika: kiiltävä R Markdowniin, se ei ole enää HTML-tiedosto - se on pieni Shiny-sovellus. Ja se tarkoittaa, että se tarvitsee kiiltävän palvelimen toimiakseen.

Kuten aiemmin mainitsin, kenellä tahansa, jolla on R, RStudio ja kiiltävä paketti, paikallisessa järjestelmässä on kiiltävä palvelin. Tämä helpottaa minkä tahansa kiiltävän sovelluksen jakamista muiden R-käyttäjien kanssa. Voit lähettää heille asiakirjan sähköpostitse tai tyylikkäästi lähettää sen verkossa pakattuna tiedostona ja käyttää kiiltävä :: runUrl () komento. On erityisiä runGitHub () ja runGist () GitHubin sovellusten toiminnot, jotka ovat käteviä, jos käytät GitHubia projekteissa, jotka zip-projektissa, kuten datatiedostot, automaattisesti zip-projektissa.

Mutta on todennäköistä, että haluat jossain vaiheessa näyttää työsi muille kuin R-käyttäjille, mikä vaatii julkisesti saavutettavan Shiny-palvelimen. Todennäköisesti helpoin vaihtoehto on RStudion shinyapps.io-palvelu. Se on ilmainen muutamille rajoitetuille julkisille sovelluksille, jotka ovat erittäin kevyitä. Maksetut tilit hinnoitellaan niiden aktiivisten tuntien määrän perusteella, joita ne tarjoavat sovelluksillesi. Aktiiviset tunnit mittaavat sovelluksen aktiivista käyttöä - yksi tunti päällä oleva henkilö on sama tunti kuin 100 ihmistä tunnissa. Jotta pari sovellusta olisi käytettävissä 24x7 kertaa, tarvitset $ 1 100 / vuosi vakiotilin, jossa on 2000 tuntia.

Voit myös rakentaa oman Shiny-palvelimesi pilvipalveluun, kuten AWS ja asennukset R: lle sekä RStudion Shiny-palvelinohjelmiston ilmaisen version. Dean Attali tarjoaa loistavan askel askeleelta -opastuksen, joka näyttää, kuinka se tehdään Digital Oceanissa, jossa voit rakentaa ja käyttää pientä Shiny-palvelinta vain 5 dollaria kuukaudessa isännöintikustannuksista huolimatta aktiivisista tunneista. Kompromissi tekee omia korjaustiedostojasi ja R / kirjastopäivityksiäsi - ja vankkoihin sovelluksiin saatat tarvita heftier-virtuaalipalvelimen kuin halvin 1G-pisara.

Lisää interaktiivinen kartta

Lopuksi käyn läpi miten lisäsin interaktiivisen kartan tähän asiakirjaan esitteiden avulla.

Ensinnäkin tarvitset tiedoston, joka sisältää paikkatiedot ja numeeriset tiedot, jotta sovelluksesi tietää kunkin postinumeron muodon. Alla oleva koodi selittää, miten paikkatietokehys luodaan käyttämällä tidycensus- ja sf-paketteja.

Vuorovaikutteisuutta varten luon paikkatiedoista dynaamisen version, joten vain valitut kaupungit näkyvät kartalla. Alla on koodini siihen. Se voi näyttää hieman toistuvalta, mutta pyrin luettavuuteen lyhyyden sijaan. Kiristä oma versiosi vapaasti.

mapdata <- reaktiivinen ({

if ("Koko massa"%% input $ mycities) {

ma_appdata_for_map%>%

dplyr :: select (postinumero) = GEOID, MedianHouseholdIncome = medincome, MedianMonthlyHousingCost = medmonthlyhousingcost, väestö = pop, kaupunki, County = county.name, osavaltio, lat, pitkä, tulot, asunto, pop, geometria)%>%

muuttua(

Korostettu = "Kyllä"

) %>%

sf :: st_as_sf ()

} muu {

dplyr :: suodatin (ma_appdata_for_map, kaupunki%% input $ mycities)%>%

dplyr :: select (postinumero) = GEOID, MedianHouseholdIncome = medincome, MedianMonthlyHousingCost = medmonthlyhousingcost, väestö = pop, kaupunki, County = county.name, osavaltio, lat, pitkä, tulot, asunto, pop, geometria)%>%

dplyr :: mutatoi (

Korostettu = ifelse (Kaupunki%% input $ mycities, "Kyllä", "Ei")

) %>%

sf :: st_as_sf ()

}

})

Reaktiivisen toiminnon pitäisi olla jo tuttu. Minun jos ja muu lausunnoissa otetaan huomioon, onko käyttäjä valinnut koko joukkueen vai vain yksittäiset kaupungit. Suodatin vain valituille kaupungeille paitsi koko massa. Molemmissa tapauksissa käytän tavanomaista dplyr valitse () -toiminto, jonka avulla haluat valita kartassa haluamasi sarakkeet, varmista, että sisällytät Lat Latitude, Long for Longitude ja geometria, joka pitää postinumeron monikulmion muotoiset tiedostot. Jokaisen viimeinen rivi jos() koodi -osio varmistaa, että tulokset ovat sf (yksinkertaiset ominaisuudet) paikkatietokohde. Vaikka en tarvinnut sitä koodia paikallisessa Macissani, sovellus toimi paremmin osoitteessa shinyapps.io, kun lisäsin sen.

Nyt on aika työskennellä kartan värien parissa. Perustan kaksi reaktiivista väripalettia lehtikartalleni, yhden tuloja varten ja toisen asumiskustannuksia varten. Molemmissa tapauksissa käytän vihreitä, mutta voit valita haluamasi.

incomepal <- reaktiivinen ({

esite :: colorNumeric (paletti = "Vihreät",

domain = mapdata () $ MedianHouseholdIncome)

})

housingpal <- reaktiivinen ({

esite :: colorNumeric (paletti = "Vihreät",

domain = mapdata () $ MedianMonthlyHousingCost)

})

Haluan, että myös nämä ovat reaktiivisia, joten ne muuttuvat käyttäjän valintojen perusteella. Verkkotunnusargumentti määrittelee arvot, jotka paletti näyttää. Ensimmäisessä tapauksessa se on reaktiivisen mapdata-objektini MedianHouseholdIncome -sarake - mapdata-koodattu mapdata () koska se on reaktiivinen; toisessa tapauksessa se on MedianMonthlyHousingCost -sarake.

Asetan myös tarkalleen kuinka haluan ponnahdusikkunani näkyvän. Tämä voi viedä sekoituksen HTML: stä (

on HTML-rivinvaihto) ja tietokehyssarakkeet. Vaikka voit varmasti käyttää perus-R: itä liitä () tai liitä0 () toiminnot, minusta liimapaketti on paljon helpompaa käsiteltäessä useampaa kuin yhtä muuttujaa sekoitettuna tekstiin. Alla näet, että minun täytyy vain liittää muuttujat, jotka haluan arvioida kiharoiden aaltosulkeisiin. Tietysti myös ponnahdusikkunan on oltava reaktiivinen, joten myös se muuttuu käyttäjän valinnan mukaan.

mypopups <- reaktiivinen ({

liima :: liima ("Postinumero: {mapdata () $ ZipCode}

Kotitalouden mediaanitulo: {mapdata () $ tulot}

Mediaani kuukausittainen asumiskustannus: {mapdata () $ housing}

Väestö: {mapdata () $ Pop}

Kaupunki: {mapdata () $ Kaupunki}

Lääni: {mapdata () $ County} ")

})

Lopuksi koodi itse esitteelle.

esite :: renderLeaflet ({

esite (mapdata ())%>%

addProviderTiles ("CartoDB.Positron")%>%

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

täyttöteho = 0,7,

paino = 1,0,

väri = "musta",

sileäKerroin = 0,2,

popup = mypopups (),

group = "Kotitalouden tulot"

) %>%

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

täyttöteho = 0,7,

paino = 0,2,

väri = "musta",

sileäKerroin = 0,2,

popup = mypopups (),

group = "Asumiskustannukset"

) %>%

addLayersControl (

baseGroups = c ("Kotitalouden tulot", "Asumiskustannukset"),

position = "bottomleft",

options = layerControlOptions (tiivistetty = EPÄTOSI)

)

})

renderLehti () on kiiltävä renderöintitoiminto, joka näyttää dynaamisen datavizin dynaamisen mapdata-objektin perusteella. Tämän toiminnon sisällä on "tavallinen" esitteiden kartoituskoodi. Ensimmäinen rivi, esite (mapdata ()), luo R-esiteobjektin reaktiivisesta mapdata-objektista. Se käyttää esitteen pakkausta, joka on R-kääre leaflet.js-kirjastoon. Seuraava rivi lisää CartoDB: n taustakarttaryhmien tyylin.

addPolygons () toiminto kertoo esitteestä, kuinka postinumeron polygonit näytetään. Haluan, että se väritetään MideanHouseholdIncome -sarakkeessa käyttämällä aiemmin määrittelemääni tulopalettia, incomepal. Suurin osa lopuista näistä väitteistä on muotoilua. ponnahdusikkuna argumentti asettaa ponnahdusikkunan olevan mypopupit aiemmin luomani objekti, ja ryhmä-argumentti antaa nimen karttakerrokselle.

Lisään toisen samanlaisen kerroksen mediaanikuukausikuluihin. Ja lopuksi addLayersControl () laittaa napsautettavan selitteen jokaiselle tasolle vasempaan alakulmaan.

Sharon Machlis /

Jos haluat oppia lisää R-kartoituksesta esitteellä, tutustu oppaaseen "Luo karttoja R: ssä 10 (melko) helppoa vaihetta".

Lopullinen R-merkintätiedosto

Näet lopullisen R Markdown -tiedoston GitHubissa. Jos tarkastelet koodia huolellisesti, saatat huomata muutaman lisäyksen. Lisäsin All Massin selectInput () avattavan luettelon valintavektori, joten koodi on nyt

selectInput ("mycities", "Valitse yksi tai useampi kaupunki:",

valinnat = c ("All Mass", lajittelu (ainutlaatuinen (markdowndata $ City))),

useita = TOSI, valittu = "Boston")

Ja sitten muutin useita muita koodiriviä antaakseni toisen vaihtoehdon, jos All Mass on valittu, kuten luomalla dynaaminen muuttuja selected_places, joka sanoo "Massachusetts", jos "All Mass" on yksi valituista kaupungeista.

valittu_paikat <- reaktiivinen ({

if ("Koko massa"%% input $ mycities) {

"Massachusetts"

} muu {

liitä (kirjoita $ mycities,

sep = "", kutista = ",")

}

})

Huomaa myös uusi YAML-otsikko:

---

otsikko: "Kotitalouksien mediaanitulot postinumeron mukaan"

output: html_document

resurssi_tiedostot:

- mamarkdowndata.rdata

- zip_mass_appdata_for_map.rds

ajonaika: kiiltävä

---

Ettäresurssit_tiedostot: vaihtoehto sanoo, että tämä asiakirja vaatii kaksi muuta tiedostoa toimiakseen, mamarkdowndata.rdata ja zip_mass_appdata_for_map.rds. Tämän avulla shinyapps.io tietää, että nämä tiedostot on ladattava yhdessä R Markdown -asiakirjan kanssa, kun asennat tiedostoarsconnect :: deployDoc ("docname.Rmd").

Näet tämän interaktiivisen R Markdown -asiakirjan Shiny-toiminnon kanssa osoitteessa //idgrapps.shinyapps.io/runtimeshiny/. Lataaminen voi viedä hetken, koska en yritä optimoida tätä koodia nopeutta varten. RStudiossa on joitain resursseja, jos haluat oppia kiiltävien sovellusten nopeuttamisesta.

Kuinka tämä eroaa 'todellisesta' Kiiltävästä sovelluksesta?

Tämä erittäin ladattu Shiny R Markdown -asiakirja eroaa täysimittaisesta Shiny-sovelluksesta muutamalla avaintavalla.

1. Kiiltävän sovelluksen on oltava yhdessä tiedostossa nimeltä app.R tai kahdessa tiedostossa ui.R ja server.R. Sovellus voi lähde muita tiedostoja muilla nimillä, mutta tiedostojen nimeämisrakenne on ehdoton. Yhden tiedoston app.R -sovelluksessa tarvitaan osioita ui: lle (käyttöliittymä, joka määrittelee käyttäjän näkemät ja vuorovaikutuksessa olevat toiminnot) ja palvelimelle.

2. Kiiltävät sovellusasettelut on rakennettu Bootstrap-sivuruudukon kehyksen ympärille. Lisätietoja asettelurakenteesta on RStudion Shiny-sovelluksen asetteluoppaassa.

3. Useimpien dynaamisten komponenttien, jotka haluat renderöidä, kuten esimerkiksi kaaviot ja taulukot, on oltava erityisesti sijoitettu jonnekin sivulle, jossa on lisätoimintoja ja määritelmiä. Esimerkiksi interaktiivinen esitteiden kartta tarvitsisi koodin, kuten leafletOutput ("mymap") jossain käyttöliittymässä kertoa sovellukselle, missä sen pitäisi näkyä palvelinkoodin, kuten

output $ mymap <- renderLeaflet ({#KARTTAKOODI TÄSTÄ)

määritellä kartan luomisen takana oleva logiikka.

Tässä on esimerkki Shiny app.R-tiedostosta tämän sovelluksen histogrammille ja taulukolle:

kirjasto ("kiiltävä")

kirjasto ("dplyr")

kirjasto ("ggplot2")

kirjasto ("DT")

vaihtoehdot (scipen = 999)

lataa ("mamarkdowndata.rdata") # lataa muuttujan markdowndata

ma_appdata_for_map <- readRDS ("zip_mass_appdata_for_map.rds")

# Määritä käyttöliittymä

ui <- fluidPage (

# Hakemuksen otsikko

titlePanel ("Tulo- ja asumiskustannukset postinumeron mukaan"),

# Sivupalkki

sivupalkki Asettelu (

sivupalkkiPaneeli (

selectInput ("mycities", "Valitse yksi tai useampi Massachusettsin paikka:", valinnat = c ("All Mass", lajittelu (yksilöllinen (markdowndata $ City))), useita = TOSI, valittu = "Boston"),

br (),

vahva ("Huomaa: joissakin kaupungeissa voi olla useampi kuin yksi postinumero postinumeroita varten. Esimerkiksi Allston, Brighton, Dorchester ja useita muita kaupunginosia ei sisälly postinumeron paikkanimeen \" Boston \ ".")

),

# Näytä histogrammi

mainPanel (

h4 (htmlOutput ("histogramHeadline")),

plotOutput ("myhistogrammi"),

br (),

h4 (htmlOutput ("tableHeadline")),

DTOutput ("mytable")

)

)

)

# Määritä palvelimen logiikka, jota tarvitaan histogrammin piirtämiseen

palvelin <- toiminto (tulo, lähtö) {

mydata <- reaktiivinen ({

if ("Koko massa"%% input $ mycities) {

markdowndata

} muu {

suodatin (markdowndata, kaupunki%% input $ mycities)

}

})

valittu_paikat <- reaktiivinen ({

if ("Koko massa"%% input $ mycities) {

"Massachusetts"

} muu {

liitä (kirjoita $ mycities,

sep = "", kutista = ",")

}

})

output $ histogramHeadline <- renderUI ({

liitä ("Histogrammi", valitut_paikat (), "tulotiedot")

})

output $ tableHeadline <- renderUI ({

liitä ("Data for", selected_places ())

})

tulosta $ myhistogram <- renderPlot ({

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

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

teema_klassikko () +

xlab ("") +

ylab ("") +

scale_x_continuous (tunnisteet = dollari)

})

output $ mytable <- renderDT ({

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

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

formatCurrency (6, valuutta = "", numerot = 0)

})

}

# Suorita sovellus

shinyApp (ui = ui, palvelin = palvelin)

Saat lisätietoja tällaisten kiiltävien sovellusten rakentamisesta RStudion Shiny-intro-oppaista.

Saat lisää R-vinkkejä siirtymällä Do More With R -videosivulle tai Do More With R -soittolistaan ​​YouTubessa.

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