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:

  1. Sign up for an account on shinyapps.io
  2. Find your token on the shinyapps.io website and copy the command to your clipboard
  3. Run the command in your RStudio session in the console
  4. 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:

  1. What the base app looks like on your computer before interacting with anything
  2. What the app looks like after changing the two new elements that you included
LS0tCnRpdGxlOiAiTGFiMTA6IFNoaW55IgpvdXRwdXQ6IAogIGh0bWxfZG9jdW1lbnQ6IAogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIGNzczogc3RhdDQxLWxhYi10aGVtZS5jc3MKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSkKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkocGxvdGx5KQpgYGAKClRvZGF5LCB3ZSBhcmUgZnVsbHkgZGl2aW5nIGludG8gaW50ZXJhY3Rpdml0eSBhbmQgYnVpbGRpbmcgYSBzaGlueSBhcHAhIAoKIyBQYXJ0IDE6IFN0YXJ0ZXIgU2hpbnkgQXBwCgpJJ3ZlIHByb3ZpZGVkIGFuIGV4YW1wbGUgYXBwIGFzIGEgLlIgZmlsZSBvbiBtb29kbGUgKG1ha2Ugc3VyZSBkYXRhc2V0cyBhcmUgc2F2ZWQgaW4gdGhlIHNhbWUgZm9sZGVyIGFzIHRoZSBgYXBwLlJgIGZpbGUpLiBJdCBpcyBhbHNvIGF2YWlsYWJsZSBbb25saW5lXShodHRwczovL2FzbHVieS5zaGlueWFwcHMuaW8vTGFiMTAtc3RhcnRlci1hcHAvKSBpZiB5b3Ugd2FudCB0byBleHBsb3JlIGl0IGJlZm9yZSBzdGFydGluZyB0aGUgbGFiLiBZb3Ugc2hvdWxkIGFsc28gaW5zdGFsbCB0aGUgYGdncmVwZWxgIGFuZCBgc2hpbnlgIHBhY2thZ2VzIGlmIHlvdSBkb24ndCBhbHJlYWR5IGhhdmUgdGhlbS4gVGhlIGZvbGRlciBjb250YWlucyBvdXIgZGVhciBvbGQgZnJpZW5kIGBzdGF0ZV9sZXZlbF8yMDIwYCwgYWxvbmcgd2l0aCBhIG5ldyBkYXRhc2V0IEkndmUgbWFkZSBmb3IgeW91IGNhbGxlZCBgYWNzX3N0YXRlX2RhdGFgLiBUaGlzIGlzIGFub3RoZXIgZGF0YXNldCB3aXRoIHN0YXRlLWxldmVsIG9ic2VydmF0aW9ucywgYnV0IHRoZSByZXN1bHRzIGFyZSBkcmF3biBmcm9tIHRoZSAyMDE5IFtBbWVyaWNhbiBDb21tdW5pdHkgU3VydmV5XShodHRwczovL3d3dy5jZW5zdXMuZ292L3Byb2dyYW1zLXN1cnZleXMvYWNzL2Fib3V0Lmh0bWwpIChBQ1MpLiBUaGUgQUNTIGlzIHJ1biBieSB0aGUgQ2Vuc3VzLCBidXQgcmF0aGVyIHRoYW4gc3VydmV5aW5nICpldmVyeSBwZXJzb24gaW4gdGhlIGNvdW50cnkqIGV2ZXJ5ICoxMCB5ZWFycyosIHRoZXkgc3VydmV5IGEgKnJhbmRvbSBzYW1wbGUqIGV2ZXJ5ICoxIHllYXIqLiAKClRoZSB2YXJpYWJsZXMgSSd2ZSBpbmNsdWRlZCBmb3IgeW91IGFyZSAobm90ZSB0aGF0IG5vdCBhbGwgb2YgdGhlc2UgdmFyaWFibGVzIGFyZSBwcmUtbG9hZGVkIGludG8gdGhlIGFwcCk6IAoKKyBgbWVkX2FnZWA6IG1lZGlhbiBhZ2UgCisgYG1lZF9pbmNvbWVgOiBtZWRpYW4gaW5jb21lCisgYHRvdGFsX3BvcGA6IHRvdGFsIHBvcHVsYXRpb24gICAKKyBgcmFjZV93aGl0ZWA6IHRvdGFsIHJlcG9ydGluZyByYWNlIGFzICJ3aGl0ZSIgICAgIAorIGByYWNlX2JsYWNrX2FmYW1gOiB0b3RhbCByZXBvcnRpbmcgcmFjZSBhcyAiQmxhY2sgb3IgQWZyaWNhbiBBbWVyaWNhbiIgICAKKyBgcmFjZV9hbV9pbmRpYW5gOiB0b3RhbCByZXBvcnRpbmcgcmFjZSBhcyAiQW1lcmljYW4gSW5kaWFuLCBOYXRpdmUgQW1lcmljYW4sIG9yIEFsYXNrYSBuYXRpdmUiICAgICAKKyBgcmFjZV9hc2lhbmA6IHRvdGFsIHJlcG9ydGluZyByYWNlIGFzICJBc2lhbiIgICAgICAgIAorIGByYWNlX2hhd2FpaWFuX3BpYDogdG90YWwgcmVwb3J0aW5nIHJhY2UgYXMgIk5hdGl2ZSBIYXdhaWlhbiBvciBQYWNpZmljIElzbGFuZGVyIiAgIAorIGByYWNlX290aGVyYDogdG90YWwgcmVwb3J0aW5nIHJhY2UgYXMgIk90aGVyIiAgICAgICAgCisgYHJhY2VfdHdvX3BsdXNgOiB0b3RhbCByZXBvcnRpbmcgcmFjZSBhcyAiVHdvIG9yIG1vcmUgcmFjZXMiICAgICAgCisgYGJvcm5faW5fc3RhdGVgOiB0b3RhbCByZXNpZGVudHMgd2hvIHdlcmUgYm9ybiBpbiB0aGUgc3RhdGUgd2hlcmUgdGhleSBjdXJyZW50bHkgcmVzaWRlCisgYG1hbGVfYWdlX21hcnJpZWRgOiBhdmVyYWdlIGFnZSBhdCBmaXJzdCBtYXJyaWFnZSAobWFsZSkKKyBgZmVtX2FnZV9tYXJyaWVkYDogYXZlcmFnZSBhZ2UgYXQgZmlyc3QgbWFycmlhZ2UgKGZlbWFsZSkKKyBgaHNfZGlwbG9tYWA6IHRvdGFsIHdobyByZWNlaXZlZCBoaWdoIHNjaG9vbCBkaXBsb21hCisgYGFzc29jaWF0ZV9kZWdyZWVgOiB0b3RhbCB3aG8gcmVjZWl2ZWQgYXNzb2NpYXRlJ3MgZGVncmVlCisgYGJhY2hlbG9yc19kZWdyZWVgOiB0b3RhbCB3aG8gcmVjZWl2ZWQgYmFjaGVsb3IncyBkZWdyZWUKKyBgbWFzdGVyc19kZWdyZWVgOiB0b3RhbCB3aG8gcmVjZWl2ZWQgbWFzdGVyJ3MgZGVncmVlCisgYHByb2ZfZGVncmVlYDogdG90YWwgd2hvIHJlY2VpdmVkIGEgcHJvZmVzc2lvbmFsIGRlZ3JlZQorIGBkb2N0b3JhdGVfZGVncmVlYDogdG90YWwgd2hvIHJlY2VpdmVkIGEgZG9jdG9yYWdlCisgYGludGVybmV0X2FueWA6IHRvdGFsIHdobyBoYXZlIGFuIGludGVybmV0IGNvbm5lY3Rpb24KKyBgaW50ZXJuZXRfZGlhbHVwYDogdG90YWwgd2hvIGhhdmUgYSBkaWFsdXAtb25seSBpbnRlcm5ldCBjb25uZWN0aW9uCisgYGludGVybmV0X2Jyb2FkYmFuZGA6IHRvdGFsIHdobyBoYXZlIGFueSBicm9hZGJhbmQgaW50ZXJuZXQKCkFuZCBJJ20gaGFwcHkgdG8gcHJvdmlkZSB0aGUgUiBzY3JpcHQgSSB1c2VkIHRvIGFjY2VzcyB0aGUgQVBJLiBJZiB5b3Ugd2FudCB0byBkb3dubG9hZCBtb3JlIGRhdGEgZnJvbSB0aGUgY2Vuc3VzIChsaWtlIGZvciB5b3VyIGZpbmFsIHByb2plY3RzKSwgeW91J2xsIG5lZWQgdG8gc2lnbiB1cCBmb3IgYW4gQVBJIGtleSwgYnV0IHRoZXJlIGFyZSBhICoqdG9uKiogb2YgdmFyaWFibGVzIGF2YWlsYWJsZSBhdCBib3RoIHRoZSBzdGF0ZSBhbmQgY291bnR5IGxldmVscy4gCgojIFBhcnQgMjogWW91ciB0dXJuISAKCllvdSBzaG91bGQgYmUgYWJsZSB0byBsb2FkIHRoZSAucm1kIGZpbGUgaW50byB5b3VyIFJTdHVkaW8gc2Vzc2lvbiBhbmQgY2xpY2sgInJ1biBhcHAiIHRvIGJ1aWxkIHRoZSBhcHAgbG9jYWxseS4gRm9yIHRoaXMgbGFiLCB5b3Ugc2hvdWxkIGFkZCB0d28gbmV3IGludGVyYWN0aXZlIGVsZW1lbnRzIHRvIHRoZSBleGlzdGluZyBjb2RlLiBUaGUgdmlkZW8gZm9yIGNsYXNzIHRvZGF5IHdpbGwgYmUgKmV4dHJlbWVseSogaGVscGZ1bCBoZXJlLiAKCklkZWFzOiAKCi0gQWRkIGEgYGNvbG9yYCBvciBhIGBzaXplYCBhZXN0aGV0aWMgdG8gdGhlIHNjYXR0ZXJwbG90Ci0gQWRkIGFkZGl0aW9uYWwgdmlzdWFsaXphdGlvbnMgKHBlcmhhcHMgYSBtYXApIG9yIGNoYW5nZSB0aGUgb3JpZ2luYWwgdmlzdWFsaXphdGlvbgotIFVzZSBwbG90bHkgdG8gbGV0IHRoZSB1c2VyIGhvdmVyIG92ZXIgcG9pbnRzIGFuZCBzZWUgc29tZXRoaW5nIGludGVyZXN0aW5nCi0gRWRpdCB0aGUgbWVudSBvcHRpb25zIGZvciB0aGUgWCBhbmQgWSBheGVzIHRvIGFsbG93IHRoZSB1c2VyIHRvIGNob29zZSBhbnkgb2YgdGhlIGF2YWlsYWJsZSB2YXJpYWJsZXMgKGluc3RlYWQgb2YgdGhlIHNhbXBsZSBJJ3ZlIGluY2x1ZGVkKQotIEFsbG93IHRoZSB1c2VyIHRvIHN1YnNldCB0aGUgZGF0YSAoaW4gYW55IHdheSB5b3Ugd2FudCkKLSBBbGxvdyB1c2VyIHRvIGNoYW5nZSBjb2xvciBwYWxldHRlCi0gLi4uIAoKUlN0dWRpbyBoYXMgYSBbd3JpdHRlbiB0dXRvcmlhbF0oaHR0cHM6Ly9zaGlueS5yc3R1ZGlvLmNvbS90dXRvcmlhbC93cml0dGVuLXR1dG9yaWFsL2xlc3NvbjMvKSBpZiB5b3Ugd2FudCBhIGRlZXBlciBkaXZlIGludG8gdGhlIG9wdGlvbnMgdGhhdCBhcmUgYXZhaWxhYmxlLiBJZiB5b3UgcGxhbiBvbiBidWlsZGluZyBhIHNoaW55IGFwcCBmb3IgYW55IG9mIHlvdXIgcHJvamVjdHMsIHRoaXMgaXMgYSBncmVhdCByZXNvdXJjZSB0byBnZXQgYWRkaXRpb25hbCBwcmFjdGljZS4gCgpJZiB0aGlzIGlzIG5vdCBzcGVha2luZyB0byB5b3UsIHlvdSBhcmUgYWxzbyB3ZWxjb21lIHRvIGJ1aWxkIGFuIGFwcCB5b3Vyc2VsZiwgdXNpbmcgYW55IGRhdGEgeW91IHdpc2ghIEl0IHNob3VsZCBpbmNsdWRlIGF0IGxlYXN0IDIgdXNlciBpbnB1dHMuIChJIGRvbid0IHJlY29tbWVuZCB0aGlzIHVubGVzcyB5b3UgYXJlIHBsYW5uaW5nIHRvICJkb3VibGUgZGlwIiBhbmQgdXNlIHlvdXIgcHJvamVjdCBkYXRhKQoKIyMgU3VibWl0dGluZyB5b3VyIHdvcmsgCgpJdCdzIGEgbGl0dGxlIHRyaWNraWVyIHRvIHNoYXJlIHNoaW55IGFwcHMgLSB3ZSBjYW4ndCB1c2UgUlB1YnMsIHNpbmNlIHdlIG5lZWQgYSBzZXJ2ZXIgdG8gcnVuIFIgYmVoaW5kIHRoZSBzY2VuZXMuIAoKIyMjIE9wdGlvbiAxOiBzaGlueWFwcHMuaW8KCkp1c3QgbGlrZSBSUHVicyBpcyBhIGZyZWUgb3B0aW9uIHRvIHB1Ymxpc2ggSFRNTCB3ZWJzaXRlcyBmcm9tIFJTdHVkaW8sIHNoaW55YXBwcy5pbyBvZmZlcnMgYSBmcmVlIHdheSB0byBzaGFyZSBzaGlueSBhcHBzLiBZb3UgZG8gaGF2ZSB0byBzaWduIHVwIGZvciBhbiBhY2NvdW50LCBhbmQgaXQncyBhIGxpdHRsZSBtb3JlIGludm9sdmVkIHRvIGNvbm5lY3QgeW91ciBsb2NhbCBSU3R1ZGlvIHRvIHlvdXIgc2hpbnlhcHBzIGFjY291bnQsIGJ1dCBvbmNlIHlvdSBzZXQgaXQgdXAgaXQgYmVjb21lcyBleHRyZW1lbHkgZWFzeSB0byBhZGQgbW9yZSAoSSBwb3N0ZWQgdGhlIHN0YXJ0ZXIgYXBwIHRvIG15IGFjY291bnQgaW4gfjMwIHNlY29uZHMpLiAKCldpdGggdGhlIGZyZWUgYWNjb3VudCwgeW91IGFyZSBsaW1pdGVkIHRvIDUgc2hpbnkgYXBwcyBhbmQgMjUgYWN0aXZlIGhvdXJzIHBlciBtb250aC4gVGhpcyBzaG91bGQgYmUgcGxlbnR5IGZvciB0aGlzIGNvdXJzZS4gCgpUaGUgYmFzaWMgc3RlcHMgYXJlOiAKCjEuIFNpZ24gdXAgZm9yIGFuIGFjY291bnQgb24gc2hpbnlhcHBzLmlvCjIuIEZpbmQgeW91ciB0b2tlbiBvbiB0aGUgc2hpbnlhcHBzLmlvIHdlYnNpdGUgYW5kIGNvcHkgdGhlIGNvbW1hbmQgdG8geW91ciBjbGlwYm9hcmQKMy4gUnVuIHRoZSBjb21tYW5kIGluIHlvdXIgUlN0dWRpbyBzZXNzaW9uIGluIHRoZSBjb25zb2xlCjQuIEFmdGVyIGNvbXBpbGluZyB5b3VyIHNoaW55IGFwcCwgY2xpY2sgdGhlICJwdWJsaXNoIiBidXR0b24gaW4gdGhlIHVwcGVyIHJpZ2h0IGNvcm5lciBhbmQgeW91IHNob3VsZCBiZSBnb29kIHRvIGdvISBUYWtlIG5vdGUgb2YgdGhlIFVSTCBvZiB5b3VyIGFwcC4gCgpGb3IgYSBtb3JlIGRldGFpbGVkIHdhbGstdGhyb3VnaCAoaW5jbHVkaW5nIHBpY3R1cmVzISkgc2VlIHRoZSBbc2hpbnlhcHBzIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vZG9jcy5yc3R1ZGlvLmNvbS9zaGlueWFwcHMuaW8vZ2V0dGluZy1zdGFydGVkLmh0bWwjaW5zdGFsbGF0aW9uKS4gCgojIyMgT3B0aW9uIDI6IFN1Ym1pdCAucm1kICsgc2NyZWVuc2hvdHMKCklmIHRoZSBzdGVwcyBhYm92ZSBzZWVtIGxpa2UgdG9vIG11Y2gsIGFuZCBlc3BlY2lhbGx5IGlmIHlvdSBkb24ndCBwbGFuIG9uIG1ha2luZyBhIHNoaW55IGFwcCBmb3IgUHJvamVjdCAzIG9yIHlvdXIgZmluYWwgcHJvamVjdCwgdGhhdCdzIE9LISBZb3UgY2FuIHN1Ym1pdCB5b3VyIGBhcHAuUmAgZmlsZSBvbiBtb29kbGUuIFlvdSBzaG91bGQgbWFrZSBzdXJlIHRoYXQgeW91ciBhcHAgaXMgcmVwcm9kdWNpYmxlIGJ5IG9wZW5pbmcgaXQgaW4gYSBmcmVzaCBSU3R1ZGlvIHNlc3Npb24gYW5kIGNoZWNraW5nIHRoYXQgaXQgc3RpbGwgcnVucy4gCgpZb3Ugc2hvdWxkIGFsc28gaW5jbHVkZSB0d28gc2NyZWVuc2hvdHMgb2YgeW91ciBhcHA6IAoKICAxLiBXaGF0IHRoZSBiYXNlIGFwcCBsb29rcyBsaWtlIG9uIHlvdXIgY29tcHV0ZXIgKmJlZm9yZSogaW50ZXJhY3Rpbmcgd2l0aCBhbnl0aGluZwogIDIuIFdoYXQgdGhlIGFwcCBsb29rcyBsaWtlIGFmdGVyIGNoYW5naW5nIHRoZSB0d28gbmV3IGVsZW1lbnRzIHRoYXQgeW91IGluY2x1ZGVkCiAgCg==