Today, we are fully diving into interactivity and building a shiny app!
Part 1: Starter Shiny App
I’ve provided an example app as a .R file on moodle (make sure datasets are saved in the same folder as the app.R
file). It is also available online if you want to explore it before starting the lab. You should also install the ggrepel
and shiny
packages if you don’t already have them. The folder contains our dear old friend state_level_2020
, along with a new dataset I’ve made for you called acs_state_data
. This is another dataset with state-level observations, but the results are drawn from the 2019 American Community Survey (ACS). The ACS is run by the Census, but rather than surveying every person in the country every 10 years, they survey a random sample every 1 year.
The variables I’ve included for you are (note that not all of these variables are pre-loaded into the app):
med_age
: median age
med_income
: median income
total_pop
: total population
race_white
: total reporting race as “white”
race_black_afam
: total reporting race as “Black or African American”
race_am_indian
: total reporting race as “American Indian, Native American, or Alaska native”
race_asian
: total reporting race as “Asian”
race_hawaiian_pi
: total reporting race as “Native Hawaiian or Pacific Islander”
race_other
: total reporting race as “Other”
race_two_plus
: total reporting race as “Two or more races”
born_in_state
: total residents who were born in the state where they currently reside
male_age_married
: average age at first marriage (male)
fem_age_married
: average age at first marriage (female)
hs_diploma
: total who received high school diploma
associate_degree
: total who received associate’s degree
bachelors_degree
: total who received bachelor’s degree
masters_degree
: total who received master’s degree
prof_degree
: total who received a professional degree
doctorate_degree
: total who received a doctorage
internet_any
: total who have an internet connection
internet_dialup
: total who have a dialup-only internet connection
internet_broadband
: total who have any broadband internet
And I’m happy to provide the R script I used to access the API. If you want to download more data from the census (like for your final projects), you’ll need to sign up for an API key, but there are a ton of variables available at both the state and county levels.
Part 2: Your turn!
You should be able to load the .rmd file into your RStudio session and click “run app” to build the app locally. For this lab, you should add two new interactive elements to the existing code. The video for class today will be extremely helpful here.
Ideas:
- Add a
color
or a size
aesthetic to the scatterplot
- Add additional visualizations (perhaps a map) or change the original visualization
- Use plotly to let the user hover over points and see something interesting
- Edit the menu options for the X and Y axes to allow the user to choose any of the available variables (instead of the sample I’ve included)
- Allow the user to subset the data (in any way you want)
- Allow user to change color palette
- …
RStudio has a written tutorial if you want a deeper dive into the options that are available. If you plan on building a shiny app for any of your projects, this is a great resource to get additional practice.
If this is not speaking to you, you are also welcome to build an app yourself, using any data you wish! It should include at least 2 user inputs. (I don’t recommend this unless you are planning to “double dip” and use your project data)
Submitting your work
It’s a little trickier to share shiny apps - we can’t use RPubs, since we need a server to run R behind the scenes.
Option 1: shinyapps.io
Just like RPubs is a free option to publish HTML websites from RStudio, shinyapps.io offers a free way to share shiny apps. You do have to sign up for an account, and it’s a little more involved to connect your local RStudio to your shinyapps account, but once you set it up it becomes extremely easy to add more (I posted the starter app to my account in ~30 seconds).
With the free account, you are limited to 5 shiny apps and 25 active hours per month. This should be plenty for this course.
The basic steps are:
- Sign up for an account on shinyapps.io
- Find your token on the shinyapps.io website and copy the command to your clipboard
- Run the command in your RStudio session in the console
- After compiling your shiny app, click the “publish” button in the upper right corner and you should be good to go! Take note of the URL of your app.
For a more detailed walk-through (including pictures!) see the shinyapps documentation.
Option 2: Submit .rmd + screenshots
If the steps above seem like too much, and especially if you don’t plan on making a shiny app for Project 3 or your final project, that’s OK! You can submit your app.R
file on moodle. You should make sure that your app is reproducible by opening it in a fresh RStudio session and checking that it still runs.
You should also include two screenshots of your app:
- What the base app looks like on your computer before interacting with anything
- What the app looks like after changing the two new elements that you included
LS0tCnRpdGxlOiAiTGFiMTA6IFNoaW55IgpvdXRwdXQ6IAogIGh0bWxfZG9jdW1lbnQ6IAogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIGNzczogc3RhdDQxLWxhYi10aGVtZS5jc3MKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSkKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkocGxvdGx5KQpgYGAKClRvZGF5LCB3ZSBhcmUgZnVsbHkgZGl2aW5nIGludG8gaW50ZXJhY3Rpdml0eSBhbmQgYnVpbGRpbmcgYSBzaGlueSBhcHAhIAoKIyBQYXJ0IDE6IFN0YXJ0ZXIgU2hpbnkgQXBwCgpJJ3ZlIHByb3ZpZGVkIGFuIGV4YW1wbGUgYXBwIGFzIGEgLlIgZmlsZSBvbiBtb29kbGUgKG1ha2Ugc3VyZSBkYXRhc2V0cyBhcmUgc2F2ZWQgaW4gdGhlIHNhbWUgZm9sZGVyIGFzIHRoZSBgYXBwLlJgIGZpbGUpLiBJdCBpcyBhbHNvIGF2YWlsYWJsZSBbb25saW5lXShodHRwczovL2FzbHVieS5zaGlueWFwcHMuaW8vTGFiMTAtc3RhcnRlci1hcHAvKSBpZiB5b3Ugd2FudCB0byBleHBsb3JlIGl0IGJlZm9yZSBzdGFydGluZyB0aGUgbGFiLiBZb3Ugc2hvdWxkIGFsc28gaW5zdGFsbCB0aGUgYGdncmVwZWxgIGFuZCBgc2hpbnlgIHBhY2thZ2VzIGlmIHlvdSBkb24ndCBhbHJlYWR5IGhhdmUgdGhlbS4gVGhlIGZvbGRlciBjb250YWlucyBvdXIgZGVhciBvbGQgZnJpZW5kIGBzdGF0ZV9sZXZlbF8yMDIwYCwgYWxvbmcgd2l0aCBhIG5ldyBkYXRhc2V0IEkndmUgbWFkZSBmb3IgeW91IGNhbGxlZCBgYWNzX3N0YXRlX2RhdGFgLiBUaGlzIGlzIGFub3RoZXIgZGF0YXNldCB3aXRoIHN0YXRlLWxldmVsIG9ic2VydmF0aW9ucywgYnV0IHRoZSByZXN1bHRzIGFyZSBkcmF3biBmcm9tIHRoZSAyMDE5IFtBbWVyaWNhbiBDb21tdW5pdHkgU3VydmV5XShodHRwczovL3d3dy5jZW5zdXMuZ292L3Byb2dyYW1zLXN1cnZleXMvYWNzL2Fib3V0Lmh0bWwpIChBQ1MpLiBUaGUgQUNTIGlzIHJ1biBieSB0aGUgQ2Vuc3VzLCBidXQgcmF0aGVyIHRoYW4gc3VydmV5aW5nICpldmVyeSBwZXJzb24gaW4gdGhlIGNvdW50cnkqIGV2ZXJ5ICoxMCB5ZWFycyosIHRoZXkgc3VydmV5IGEgKnJhbmRvbSBzYW1wbGUqIGV2ZXJ5ICoxIHllYXIqLiAKClRoZSB2YXJpYWJsZXMgSSd2ZSBpbmNsdWRlZCBmb3IgeW91IGFyZSAobm90ZSB0aGF0IG5vdCBhbGwgb2YgdGhlc2UgdmFyaWFibGVzIGFyZSBwcmUtbG9hZGVkIGludG8gdGhlIGFwcCk6IAoKKyBgbWVkX2FnZWA6IG1lZGlhbiBhZ2UgCisgYG1lZF9pbmNvbWVgOiBtZWRpYW4gaW5jb21lCisgYHRvdGFsX3BvcGA6IHRvdGFsIHBvcHVsYXRpb24gICAKKyBgcmFjZV93aGl0ZWA6IHRvdGFsIHJlcG9ydGluZyByYWNlIGFzICJ3aGl0ZSIgICAgIAorIGByYWNlX2JsYWNrX2FmYW1gOiB0b3RhbCByZXBvcnRpbmcgcmFjZSBhcyAiQmxhY2sgb3IgQWZyaWNhbiBBbWVyaWNhbiIgICAKKyBgcmFjZV9hbV9pbmRpYW5gOiB0b3RhbCByZXBvcnRpbmcgcmFjZSBhcyAiQW1lcmljYW4gSW5kaWFuLCBOYXRpdmUgQW1lcmljYW4sIG9yIEFsYXNrYSBuYXRpdmUiICAgICAKKyBgcmFjZV9hc2lhbmA6IHRvdGFsIHJlcG9ydGluZyByYWNlIGFzICJBc2lhbiIgICAgICAgIAorIGByYWNlX2hhd2FpaWFuX3BpYDogdG90YWwgcmVwb3J0aW5nIHJhY2UgYXMgIk5hdGl2ZSBIYXdhaWlhbiBvciBQYWNpZmljIElzbGFuZGVyIiAgIAorIGByYWNlX290aGVyYDogdG90YWwgcmVwb3J0aW5nIHJhY2UgYXMgIk90aGVyIiAgICAgICAgCisgYHJhY2VfdHdvX3BsdXNgOiB0b3RhbCByZXBvcnRpbmcgcmFjZSBhcyAiVHdvIG9yIG1vcmUgcmFjZXMiICAgICAgCisgYGJvcm5faW5fc3RhdGVgOiB0b3RhbCByZXNpZGVudHMgd2hvIHdlcmUgYm9ybiBpbiB0aGUgc3RhdGUgd2hlcmUgdGhleSBjdXJyZW50bHkgcmVzaWRlCisgYG1hbGVfYWdlX21hcnJpZWRgOiBhdmVyYWdlIGFnZSBhdCBmaXJzdCBtYXJyaWFnZSAobWFsZSkKKyBgZmVtX2FnZV9tYXJyaWVkYDogYXZlcmFnZSBhZ2UgYXQgZmlyc3QgbWFycmlhZ2UgKGZlbWFsZSkKKyBgaHNfZGlwbG9tYWA6IHRvdGFsIHdobyByZWNlaXZlZCBoaWdoIHNjaG9vbCBkaXBsb21hCisgYGFzc29jaWF0ZV9kZWdyZWVgOiB0b3RhbCB3aG8gcmVjZWl2ZWQgYXNzb2NpYXRlJ3MgZGVncmVlCisgYGJhY2hlbG9yc19kZWdyZWVgOiB0b3RhbCB3aG8gcmVjZWl2ZWQgYmFjaGVsb3IncyBkZWdyZWUKKyBgbWFzdGVyc19kZWdyZWVgOiB0b3RhbCB3aG8gcmVjZWl2ZWQgbWFzdGVyJ3MgZGVncmVlCisgYHByb2ZfZGVncmVlYDogdG90YWwgd2hvIHJlY2VpdmVkIGEgcHJvZmVzc2lvbmFsIGRlZ3JlZQorIGBkb2N0b3JhdGVfZGVncmVlYDogdG90YWwgd2hvIHJlY2VpdmVkIGEgZG9jdG9yYWdlCisgYGludGVybmV0X2FueWA6IHRvdGFsIHdobyBoYXZlIGFuIGludGVybmV0IGNvbm5lY3Rpb24KKyBgaW50ZXJuZXRfZGlhbHVwYDogdG90YWwgd2hvIGhhdmUgYSBkaWFsdXAtb25seSBpbnRlcm5ldCBjb25uZWN0aW9uCisgYGludGVybmV0X2Jyb2FkYmFuZGA6IHRvdGFsIHdobyBoYXZlIGFueSBicm9hZGJhbmQgaW50ZXJuZXQKCkFuZCBJJ20gaGFwcHkgdG8gcHJvdmlkZSB0aGUgUiBzY3JpcHQgSSB1c2VkIHRvIGFjY2VzcyB0aGUgQVBJLiBJZiB5b3Ugd2FudCB0byBkb3dubG9hZCBtb3JlIGRhdGEgZnJvbSB0aGUgY2Vuc3VzIChsaWtlIGZvciB5b3VyIGZpbmFsIHByb2plY3RzKSwgeW91J2xsIG5lZWQgdG8gc2lnbiB1cCBmb3IgYW4gQVBJIGtleSwgYnV0IHRoZXJlIGFyZSBhICoqdG9uKiogb2YgdmFyaWFibGVzIGF2YWlsYWJsZSBhdCBib3RoIHRoZSBzdGF0ZSBhbmQgY291bnR5IGxldmVscy4gCgojIFBhcnQgMjogWW91ciB0dXJuISAKCllvdSBzaG91bGQgYmUgYWJsZSB0byBsb2FkIHRoZSAucm1kIGZpbGUgaW50byB5b3VyIFJTdHVkaW8gc2Vzc2lvbiBhbmQgY2xpY2sgInJ1biBhcHAiIHRvIGJ1aWxkIHRoZSBhcHAgbG9jYWxseS4gRm9yIHRoaXMgbGFiLCB5b3Ugc2hvdWxkIGFkZCB0d28gbmV3IGludGVyYWN0aXZlIGVsZW1lbnRzIHRvIHRoZSBleGlzdGluZyBjb2RlLiBUaGUgdmlkZW8gZm9yIGNsYXNzIHRvZGF5IHdpbGwgYmUgKmV4dHJlbWVseSogaGVscGZ1bCBoZXJlLiAKCklkZWFzOiAKCi0gQWRkIGEgYGNvbG9yYCBvciBhIGBzaXplYCBhZXN0aGV0aWMgdG8gdGhlIHNjYXR0ZXJwbG90Ci0gQWRkIGFkZGl0aW9uYWwgdmlzdWFsaXphdGlvbnMgKHBlcmhhcHMgYSBtYXApIG9yIGNoYW5nZSB0aGUgb3JpZ2luYWwgdmlzdWFsaXphdGlvbgotIFVzZSBwbG90bHkgdG8gbGV0IHRoZSB1c2VyIGhvdmVyIG92ZXIgcG9pbnRzIGFuZCBzZWUgc29tZXRoaW5nIGludGVyZXN0aW5nCi0gRWRpdCB0aGUgbWVudSBvcHRpb25zIGZvciB0aGUgWCBhbmQgWSBheGVzIHRvIGFsbG93IHRoZSB1c2VyIHRvIGNob29zZSBhbnkgb2YgdGhlIGF2YWlsYWJsZSB2YXJpYWJsZXMgKGluc3RlYWQgb2YgdGhlIHNhbXBsZSBJJ3ZlIGluY2x1ZGVkKQotIEFsbG93IHRoZSB1c2VyIHRvIHN1YnNldCB0aGUgZGF0YSAoaW4gYW55IHdheSB5b3Ugd2FudCkKLSBBbGxvdyB1c2VyIHRvIGNoYW5nZSBjb2xvciBwYWxldHRlCi0gLi4uIAoKUlN0dWRpbyBoYXMgYSBbd3JpdHRlbiB0dXRvcmlhbF0oaHR0cHM6Ly9zaGlueS5yc3R1ZGlvLmNvbS90dXRvcmlhbC93cml0dGVuLXR1dG9yaWFsL2xlc3NvbjMvKSBpZiB5b3Ugd2FudCBhIGRlZXBlciBkaXZlIGludG8gdGhlIG9wdGlvbnMgdGhhdCBhcmUgYXZhaWxhYmxlLiBJZiB5b3UgcGxhbiBvbiBidWlsZGluZyBhIHNoaW55IGFwcCBmb3IgYW55IG9mIHlvdXIgcHJvamVjdHMsIHRoaXMgaXMgYSBncmVhdCByZXNvdXJjZSB0byBnZXQgYWRkaXRpb25hbCBwcmFjdGljZS4gCgpJZiB0aGlzIGlzIG5vdCBzcGVha2luZyB0byB5b3UsIHlvdSBhcmUgYWxzbyB3ZWxjb21lIHRvIGJ1aWxkIGFuIGFwcCB5b3Vyc2VsZiwgdXNpbmcgYW55IGRhdGEgeW91IHdpc2ghIEl0IHNob3VsZCBpbmNsdWRlIGF0IGxlYXN0IDIgdXNlciBpbnB1dHMuIChJIGRvbid0IHJlY29tbWVuZCB0aGlzIHVubGVzcyB5b3UgYXJlIHBsYW5uaW5nIHRvICJkb3VibGUgZGlwIiBhbmQgdXNlIHlvdXIgcHJvamVjdCBkYXRhKQoKIyMgU3VibWl0dGluZyB5b3VyIHdvcmsgCgpJdCdzIGEgbGl0dGxlIHRyaWNraWVyIHRvIHNoYXJlIHNoaW55IGFwcHMgLSB3ZSBjYW4ndCB1c2UgUlB1YnMsIHNpbmNlIHdlIG5lZWQgYSBzZXJ2ZXIgdG8gcnVuIFIgYmVoaW5kIHRoZSBzY2VuZXMuIAoKIyMjIE9wdGlvbiAxOiBzaGlueWFwcHMuaW8KCkp1c3QgbGlrZSBSUHVicyBpcyBhIGZyZWUgb3B0aW9uIHRvIHB1Ymxpc2ggSFRNTCB3ZWJzaXRlcyBmcm9tIFJTdHVkaW8sIHNoaW55YXBwcy5pbyBvZmZlcnMgYSBmcmVlIHdheSB0byBzaGFyZSBzaGlueSBhcHBzLiBZb3UgZG8gaGF2ZSB0byBzaWduIHVwIGZvciBhbiBhY2NvdW50LCBhbmQgaXQncyBhIGxpdHRsZSBtb3JlIGludm9sdmVkIHRvIGNvbm5lY3QgeW91ciBsb2NhbCBSU3R1ZGlvIHRvIHlvdXIgc2hpbnlhcHBzIGFjY291bnQsIGJ1dCBvbmNlIHlvdSBzZXQgaXQgdXAgaXQgYmVjb21lcyBleHRyZW1lbHkgZWFzeSB0byBhZGQgbW9yZSAoSSBwb3N0ZWQgdGhlIHN0YXJ0ZXIgYXBwIHRvIG15IGFjY291bnQgaW4gfjMwIHNlY29uZHMpLiAKCldpdGggdGhlIGZyZWUgYWNjb3VudCwgeW91IGFyZSBsaW1pdGVkIHRvIDUgc2hpbnkgYXBwcyBhbmQgMjUgYWN0aXZlIGhvdXJzIHBlciBtb250aC4gVGhpcyBzaG91bGQgYmUgcGxlbnR5IGZvciB0aGlzIGNvdXJzZS4gCgpUaGUgYmFzaWMgc3RlcHMgYXJlOiAKCjEuIFNpZ24gdXAgZm9yIGFuIGFjY291bnQgb24gc2hpbnlhcHBzLmlvCjIuIEZpbmQgeW91ciB0b2tlbiBvbiB0aGUgc2hpbnlhcHBzLmlvIHdlYnNpdGUgYW5kIGNvcHkgdGhlIGNvbW1hbmQgdG8geW91ciBjbGlwYm9hcmQKMy4gUnVuIHRoZSBjb21tYW5kIGluIHlvdXIgUlN0dWRpbyBzZXNzaW9uIGluIHRoZSBjb25zb2xlCjQuIEFmdGVyIGNvbXBpbGluZyB5b3VyIHNoaW55IGFwcCwgY2xpY2sgdGhlICJwdWJsaXNoIiBidXR0b24gaW4gdGhlIHVwcGVyIHJpZ2h0IGNvcm5lciBhbmQgeW91IHNob3VsZCBiZSBnb29kIHRvIGdvISBUYWtlIG5vdGUgb2YgdGhlIFVSTCBvZiB5b3VyIGFwcC4gCgpGb3IgYSBtb3JlIGRldGFpbGVkIHdhbGstdGhyb3VnaCAoaW5jbHVkaW5nIHBpY3R1cmVzISkgc2VlIHRoZSBbc2hpbnlhcHBzIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vZG9jcy5yc3R1ZGlvLmNvbS9zaGlueWFwcHMuaW8vZ2V0dGluZy1zdGFydGVkLmh0bWwjaW5zdGFsbGF0aW9uKS4gCgojIyMgT3B0aW9uIDI6IFN1Ym1pdCAucm1kICsgc2NyZWVuc2hvdHMKCklmIHRoZSBzdGVwcyBhYm92ZSBzZWVtIGxpa2UgdG9vIG11Y2gsIGFuZCBlc3BlY2lhbGx5IGlmIHlvdSBkb24ndCBwbGFuIG9uIG1ha2luZyBhIHNoaW55IGFwcCBmb3IgUHJvamVjdCAzIG9yIHlvdXIgZmluYWwgcHJvamVjdCwgdGhhdCdzIE9LISBZb3UgY2FuIHN1Ym1pdCB5b3VyIGBhcHAuUmAgZmlsZSBvbiBtb29kbGUuIFlvdSBzaG91bGQgbWFrZSBzdXJlIHRoYXQgeW91ciBhcHAgaXMgcmVwcm9kdWNpYmxlIGJ5IG9wZW5pbmcgaXQgaW4gYSBmcmVzaCBSU3R1ZGlvIHNlc3Npb24gYW5kIGNoZWNraW5nIHRoYXQgaXQgc3RpbGwgcnVucy4gCgpZb3Ugc2hvdWxkIGFsc28gaW5jbHVkZSB0d28gc2NyZWVuc2hvdHMgb2YgeW91ciBhcHA6IAoKICAxLiBXaGF0IHRoZSBiYXNlIGFwcCBsb29rcyBsaWtlIG9uIHlvdXIgY29tcHV0ZXIgKmJlZm9yZSogaW50ZXJhY3Rpbmcgd2l0aCBhbnl0aGluZwogIDIuIFdoYXQgdGhlIGFwcCBsb29rcyBsaWtlIGFmdGVyIGNoYW5naW5nIHRoZSB0d28gbmV3IGVsZW1lbnRzIHRoYXQgeW91IGluY2x1ZGVkCiAgCg==