class: title-slide, left, top background-image: url(img/comments.png) background-size: contain background-position: bottom left # Speaking R ### Amelia McNamara, PhD ### Assistant Professor of Computer & <br>Information Sciences ### University of St Thomas<br>St Paul, MN, USA [<svg viewBox="0 0 512 512" style="height:1em;position:relative;display:inline-block;top:.1em;" xmlns="http://www.w3.org/2000/svg"> <path d="M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z"></path></svg> @AmeliaMN](https://twitter.com/AmeliaMN) [<svg viewBox="0 0 496 512" style="height:1em;position:relative;display:inline-block;top:.1em;" xmlns="http://www.w3.org/2000/svg"> <path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"></path></svg> AmeliaMN](www.github.com/AmeliaMN) ??? Hi, I'm Amelia McNamara. I'm an assistant professor at the University of St Thomas in Minnesota. I tweet at AmeliaMN, which is a double entendre because my last name is McNamara and I live in Minnesota. I just tweeted a link to these slides if you want to follow along. - Statistics professor - Teacher of R - high school students - high school teachers - college students - data science professionals - other statisticians --- background-image: url(img/mpls-stp-8.5x11-DakotaMap.jpg) background-size: cover background-position: top left .footnote[ Dakota landmap by [Marlena Myles](https://marlenamyl.es/) ] ??? Even though we're at a virtual conference, I want us to take a moment to consider the physical space we are each in, and the history of that space. The United States is built on land forcibly taken from Native Americans, and where I am physically located is no different. What is now called Minneapolis and St Paul was originally Dakota land, and continues to have a vibrant Native community. I chose this beautiful map of sites in the Twin Cities, labeled in the Dakota language, to show you where I'm physically grounded, and the idea of language is one I'm going to take into my talk. --- class: big-bullet # Big ideas ```r lm(bill_length_mm ~ flipper_length_mm, data = penguins) ``` .pull-left[ - code is language - specifically, R code is language - consistency is key - code should be speakable - there are levels of verbalization for code - words are easy, symbols are hard - we need a style guide for speaking R ] .pull-right[ <div class="figure"> <img src="img/lter_penguins.png" alt="Drawing of three species of penguins to accompany the penguins data by Allison Horst" width="800" /> <p class="caption">Drawing of three species of penguins to accompany the penguins data by Allison Horst</p> </div> ] .footnote[[Penguin data](https://github.com/allisonhorst/palmerpenguins) and [penguin art](https://github.com/allisonhorst/palmerpenguins/tree/master/man/figures) by [Allison Horst](https://twitter.com/allison_horst) ] ??? In particular, I am interested in the idea of code as language. I'm a teacher, and have taught thousands of people how to program, mostly in R. So, I'm interested in how best to teach people programming languages, as well as how thinking of code as a language can help everyone (even experts) be more productive. --- name: cheatsheet class: center, middle background-image: url(img/Syntax-cheatsheet.jpg) background-size: contain .footnote[ Syntax cheatsheet available from the RStudio [contributed cheatsheets](https://rstudio.com/resources/cheatsheets/#contributed-cheatsheets) page ] ??? I'm going to be talking a lot about R code, and how it is like human language. Like many languages, R has different dialects, and when learning the language it's best to stick to just one. I think of three main R dialects (call them syntaxes or DSLs), so I made this cheatsheet for my students to show them what the other syntaxes look like. data.table is not on here, because I don't know how to do data.table visualizations or data.table summary statistics. If you want to implement these same tasks in data.table and send them to me, I'd love to see them! --- class: middle ![Portion of syntax cheatsheet showing how to do summary statistics in all three R syntaxes](img/Syntax-cheatsheet-zoomed.jpg) .footnote[ Syntax cheatsheet available from the RStudio [contributed cheatsheets](https://rstudio.com/resources/cheatsheets/#contributed-cheatsheets) page ] ??? Of course, practitioners really mix and match the syntaxes shown here, and more, when they are working. But, this has been useful to show students which "column" we are working in, and what the other approaches are. I'm interested in how the different syntaxes may impact learning, and whether they lead to different conceptions of data. --- class: top background-image: url(img/LanguageTED.png) background-size: contain background-position: top center .footnote[ Lera Boroditsky, "How language shapes the way we think" ([video](http://bit.ly/LanguageShapesThinking))] ??? We know human language shapes our thinking, so why should programming languages be different? --- name: KAMSC class: big-bullet ### Key Attributes of a Modern Statistical Computing Tool .footnote[McNamara, A. Key Attributes of a Modern Statistical Computing Tool. [The American Statistician, Volume 73, Issue 4. 2019](https://www.tandfonline.com/doi/abs/10.1080/00031305.2018.1482784). Or, [free pre-print on arXiv](https://arxiv.org/abs/1610.00985). ] {{content}} --- template: KAMSC - Accessibility - Easy entry for novice users - Data as a first/order persistent object - Support for a cycle of exploratory and confirmatory analysis - Flexible plot creation - Support for randomization throughout - Interactivity at every level - Inherent documentation - Simple support for narrative, publishing, and reproducibility - Flexibility to build extensions ??? Last year, I published a paper in The American Statistician, based on my dissertation research. In it, I outline an updated set of attributes for a statistical computing tool. I was inspired by the work of John Tukey in the 1960s, and Rolf Biehler, in the 1990s, both of whom thought about how our statistical interfaces could make us more productive, and how they could better support students. There are 10 attributes, and not all of them are related to speaking code out loud, but several are. --- template: KAMSC - **Accessibility** - Easy entry for novice users - Data as a first/order persistent object - Support for a cycle of exploratory and confirmatory analysis - Flexible plot creation - Support for randomization throughout - Interactivity at every level - Inherent documentation - Simple support for narrative, publishing, and reproducibility - Flexibility to build extensions ??? Accessibility means that a tool needs to be free, or very cheap. It needs to be able to be installed on a variety of operating systems. And, it needs to work for all sorts of people. --- template: KAMSC - Accessibility - **Easy entry for novice users** - Data as a first/order persistent object - Support for a cycle of exploratory and confirmatory analysis - Flexible plot creation - Support for randomization throughout - Interactivity at every level - Inherent documentation - Simple support for narrative, publishing, and reproducibility - Flexibility to build extensions ??? Easy entry for novices is about getting started using a tool. This is also called "low threshold." It's important to have something that people can get into. --- template: KAMSC - Accessibility - Easy entry for novice users - Data as a first/order persistent object - Support for a cycle of exploratory and confirmatory analysis - Flexible plot creation - Support for randomization throughout - Interactivity at every level - **Inherent documentation** - Simple support for narrative, publishing, and reproducibility - Flexibility to build extensions ??? The most relevant to speaking code out loud is "inherent documentation." Essentially, this means that a tool should make it clear what it is doing. In a Graphical User Interface, that might mean an icon or animation that visually shows what a button does. In a programming language, it means language attributes that closely mimic human language. --- template: KAMSC - Accessibility - Easy entry for novice users - Data as a first/order persistent object - Support for a cycle of exploratory and confirmatory analysis - Flexible plot creation - Support for randomization throughout - Interactivity at every level - Inherent documentation - Simple support for narrative, publishing, and reproducibility - **Flexibility to build extensions** ??? Finally, a tool needs to have the flexibility to build extensions. CS ed researchers call this a "high ceiling." Novices should not age-out or experience-out. I'm probably already losing some of you, because you are not interested in teaching and learning. But, I believe these concepts can also help you work more efficiently. If programmers are spending time trying to speed up their typing speeds, maybe they can spend some time thinking about other ways in which their If you need to debug or pair program from afar, you may need to speak about your code over the phone or video conferencing If you make code that is speakable, that may increase the use of your packages. --- layout: false class: center, middle # Accessibility --- class: middle # Universal design > "Universal Design is the design and composition of an environment so that it can be accessed, understood and used to the greatest extent possible by all people regardless of their age, size, ability or disability." > "An environment (or any building, product, or service in that environment) should be designed to meet the needs of all people who wish to use it." .footnote[What is Universal Design? [Centre for Excellence in Universal Design](http://universaldesign.ie/What-is-Universal-Design/) ] ??? Some people can't see. Some people can't type --- class: big-bullet # People who can't type Two main strategies: - Speak to the computer: - Naomi Saphra, ["What Does a Coder Do If They Can't Type?"](http://nsaphra.github.io/post/hands/) - Emily Shea, ["Perl Out Loud"](https://www.youtube.com/watch?v=Mz3JeYfBTcY) - Speak to another person: - Ian Gilman, ["Wrists & Apprentices"](https://blog.iangilman.com/2018/06/wrists-apprentices.html) "By the time I was 20 I had developed a chronic wrist injury that I still have decades later. Maybe I should have walked away from computers, but by then I was hooked! That was a dark time, but eventually I struck upon a solution... I could dictate my code to someone else who could be my hands." - Ian Gilman ??? --- class: big-bullet # People who can't see Main strategy: - have the computer speak to you - Jonathan Godfrey and Thodor Loots. "Statistical Software (R, SAS, SPSS, and Minitab) for Blind Students and Practitioners" [JSS, Volume 58 Software Review 1](https://www.jstatsoft.org/article/view/v058s01). 2013. - Jonathan Godfrey, [Statistical software and blind users](https://r-resources.massey.ac.nz/StatSoftware/) (tl;dr R is best, but could be better) - Jonathan Godfrey, [Interactive graphs for blind and print disabled people](https://www.youtube.com/watch?v=E1wS-sK2RLs) useR! 2017 ("SAS is catching up") .footnote[I guess I'm saying, check out [Dr. Jonathan Godfrey's work](https://www.massey.ac.nz/massey/expertise/profile.cfm?stref=416430) ] ??? Blind folks use screen readers, which read code outloud to them. I know people do this for all programming languages, but I'm most familiar with R. RStudio used to not be accessible, now is minimally accessible. But, R itself is good. I don't know much about how Deaf folks learn to read. --- class: big-bullet # English as the language of computing - C - Java - Python - C++ - C# - Visual Basic - JavaScript - R - PHP - Swift .footnote[Top 10 programming languages for July 2020, [TIOBE Index](https://www.tiobe.com/tiobe-index/) ([Commentary by Hadley Wickham](https://twitter.com/hadleywickham/status/1279405379449913344?s=20)) ] ??? Of course, even this seemingly-uncontroversial statement is loaded with implicit cultural implications, most specifically about what is "inherently" clear about English. The top ten programming languages in the TIOBE index are all based on English, and there are very few programming languages based in other languages. So, "clear for whom" is obviously a question. And, there is likely intersectionality. If you are blind and your first language isn't English, likely to be doubly hard. --- class: center, middle # Ease of entry --- class: big-bullet ## <svg viewBox="0 0 640 512" style="height:1em;position:relative;display:inline-block;top:.1em;" xmlns="http://www.w3.org/2000/svg"> <path d="M208 352c-2.39 0-4.78.35-7.06 1.09C187.98 357.3 174.35 360 160 360c-14.35 0-27.98-2.7-40.95-6.91-2.28-.74-4.66-1.09-7.05-1.09C49.94 352-.33 402.48 0 464.62.14 490.88 21.73 512 48 512h224c26.27 0 47.86-21.12 48-47.38.33-62.14-49.94-112.62-112-112.62zm-48-32c53.02 0 96-42.98 96-96s-42.98-96-96-96-96 42.98-96 96 42.98 96 96 96zM592 0H208c-26.47 0-48 22.25-48 49.59V96c23.42 0 45.1 6.78 64 17.8V64h352v288h-64v-64H384v64h-76.24c19.1 16.69 33.12 38.73 39.69 64H592c26.47 0 48-22.25 48-49.59V49.59C640 22.25 618.47 0 592 0z"></path></svg> How to teach programming (and other things) - Minimal guidance does not work - There is research about how people learn! - Not enough debate in CS education - Teach people how to read out loud - Silent reading comes later .footnote[ Felienne’s rstudio::conf 2019 keynote, Explicit Direct Instruction in Programming Education ([video](https://resources.rstudio.com/rstudio-conf-2019/opening-keynote-day2)), <br> Alaaeddin Swidan and Felienne Hermans. The Effect of Reading Code Aloud on Comprehension: An Empirical Study with School Students [CompEd '19: Proceedings of the ACM Conference on Global Computing Education](https://dl.acm.org/doi/10.1145/3300115.3309504) ] ??? I found Felienne's 2019 keynote at rstudio::conf extremely inspiring. In particular, one of her takeaways was how verbalizing code helps people learn better. She drew on the literature of [linguistics], and has done some studies on having students read code out loud. This was already something I was doing in my teaching, but I immediately became even more dedicated to it. --- # Carpentries ### <svg viewBox="0 0 384 512" style="height:1em;position:relative;display:inline-block;top:.1em;" xmlns="http://www.w3.org/2000/svg"> <path d="M97.12 362.63c-8.69-8.69-4.16-6.24-25.12-11.85-9.51-2.55-17.87-7.45-25.43-13.32L1.2 448.7c-4.39 10.77 3.81 22.47 15.43 22.03l52.69-2.01L105.56 507c8 8.44 22.04 5.81 26.43-4.96l52.05-127.62c-10.84 6.04-22.87 9.58-35.31 9.58-19.5 0-37.82-7.59-51.61-21.37zM382.8 448.7l-45.37-111.24c-7.56 5.88-15.92 10.77-25.43 13.32-21.07 5.64-16.45 3.18-25.12 11.85-13.79 13.78-32.12 21.37-51.62 21.37-12.44 0-24.47-3.55-35.31-9.58L252 502.04c4.39 10.77 18.44 13.4 26.43 4.96l36.25-38.28 52.69 2.01c11.62.44 19.82-11.27 15.43-22.03zM263 340c15.28-15.55 17.03-14.21 38.79-20.14 13.89-3.79 24.75-14.84 28.47-28.98 7.48-28.4 5.54-24.97 25.95-45.75 10.17-10.35 14.14-25.44 10.42-39.58-7.47-28.38-7.48-24.42 0-52.83 3.72-14.14-.25-29.23-10.42-39.58-20.41-20.78-18.47-17.36-25.95-45.75-3.72-14.14-14.58-25.19-28.47-28.98-27.88-7.61-24.52-5.62-44.95-26.41-10.17-10.35-25-14.4-38.89-10.61-27.87 7.6-23.98 7.61-51.9 0-13.89-3.79-28.72.25-38.89 10.61-20.41 20.78-17.05 18.8-44.94 26.41-13.89 3.79-24.75 14.84-28.47 28.98-7.47 28.39-5.54 24.97-25.95 45.75-10.17 10.35-14.15 25.44-10.42 39.58 7.47 28.36 7.48 24.4 0 52.82-3.72 14.14.25 29.23 10.42 39.59 20.41 20.78 18.47 17.35 25.95 45.75 3.72 14.14 14.58 25.19 28.47 28.98C104.6 325.96 106.27 325 121 340c13.23 13.47 33.84 15.88 49.74 5.82a39.676 39.676 0 0 1 42.53 0c15.89 10.06 36.5 7.65 49.73-5.82zM97.66 175.96c0-53.03 42.24-96.02 94.34-96.02s94.34 42.99 94.34 96.02-42.24 96.02-94.34 96.02-94.34-42.99-94.34-96.02z"></path></svg> Teach the most useful thing first ### <svg viewBox="0 0 576 512" style="height:1em;position:relative;display:inline-block;top:.1em;" xmlns="http://www.w3.org/2000/svg"> <path d="M208 0c-29.9 0-54.7 20.5-61.8 48.2-.8 0-1.4-.2-2.2-.2-35.3 0-64 28.7-64 64 0 4.8.6 9.5 1.7 14C52.5 138 32 166.6 32 200c0 12.6 3.2 24.3 8.3 34.9C16.3 248.7 0 274.3 0 304c0 33.3 20.4 61.9 49.4 73.9-.9 4.6-1.4 9.3-1.4 14.1 0 39.8 32.2 72 72 72 4.1 0 8.1-.5 12-1.2 9.6 28.5 36.2 49.2 68 49.2 39.8 0 72-32.2 72-72V64c0-35.3-28.7-64-64-64zm368 304c0-29.7-16.3-55.3-40.3-69.1 5.2-10.6 8.3-22.3 8.3-34.9 0-33.4-20.5-62-49.7-74 1-4.5 1.7-9.2 1.7-14 0-35.3-28.7-64-64-64-.8 0-1.5.2-2.2.2C422.7 20.5 397.9 0 368 0c-35.3 0-64 28.6-64 64v376c0 39.8 32.2 72 72 72 31.8 0 58.4-20.7 68-49.2 3.9.7 7.9 1.2 12 1.2 39.8 0 72-32.2 72-72 0-4.8-.5-9.5-1.4-14.1 29-12 49.4-40.6 49.4-73.9z"></path></svg> Reduce cognitive load ### <svg viewBox="0 0 576 512" style="height:1em;position:relative;display:inline-block;top:.1em;" xmlns="http://www.w3.org/2000/svg"> <path d="M528 64H48C21.49 64 0 85.49 0 112v288c0 26.51 21.49 48 48 48h480c26.51 0 48-21.49 48-48V112c0-26.51-21.49-48-48-48zm8 336c0 4.411-3.589 8-8 8H48c-4.411 0-8-3.589-8-8V112c0-4.411 3.589-8 8-8h480c4.411 0 8 3.589 8 8v288zM170 270v-28c0-6.627-5.373-12-12-12h-28c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm96 0v-28c0-6.627-5.373-12-12-12h-28c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm96 0v-28c0-6.627-5.373-12-12-12h-28c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm96 0v-28c0-6.627-5.373-12-12-12h-28c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm-336 82v-28c0-6.627-5.373-12-12-12H82c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm384 0v-28c0-6.627-5.373-12-12-12h-28c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zM122 188v-28c0-6.627-5.373-12-12-12H82c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm96 0v-28c0-6.627-5.373-12-12-12h-28c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm96 0v-28c0-6.627-5.373-12-12-12h-28c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm96 0v-28c0-6.627-5.373-12-12-12h-28c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm96 0v-28c0-6.627-5.373-12-12-12h-28c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm-98 158v-16c0-6.627-5.373-12-12-12H180c-6.627 0-12 5.373-12 12v16c0 6.627 5.373 12 12 12h216c6.627 0 12-5.373 12-12z"></path></svg> Don't touch the learner's keyboard ### <svg viewBox="0 0 576 512" style="height:1em;position:relative;display:inline-block;top:.1em;" xmlns="http://www.w3.org/2000/svg"> <path d="M215.03 71.05L126.06 160H24c-13.26 0-24 10.74-24 24v144c0 13.25 10.74 24 24 24h102.06l88.97 88.95c15.03 15.03 40.97 4.47 40.97-16.97V88.02c0-21.46-25.96-31.98-40.97-16.97zm233.32-51.08c-11.17-7.33-26.18-4.24-33.51 6.95-7.34 11.17-4.22 26.18 6.95 33.51 66.27 43.49 105.82 116.6 105.82 195.58 0 78.98-39.55 152.09-105.82 195.58-11.17 7.32-14.29 22.34-6.95 33.5 7.04 10.71 21.93 14.56 33.51 6.95C528.27 439.58 576 351.33 576 256S528.27 72.43 448.35 19.97zM480 256c0-63.53-32.06-121.94-85.77-156.24-11.19-7.14-26.03-3.82-33.12 7.46s-3.78 26.21 7.41 33.36C408.27 165.97 432 209.11 432 256s-23.73 90.03-63.48 115.42c-11.19 7.14-14.5 22.07-7.41 33.36 6.51 10.36 21.12 15.14 33.12 7.46C447.94 377.94 480 319.54 480 256zm-141.77-76.87c-11.58-6.33-26.19-2.16-32.61 9.45-6.39 11.61-2.16 26.2 9.45 32.61C327.98 228.28 336 241.63 336 256c0 14.38-8.02 27.72-20.92 34.81-11.61 6.41-15.84 21-9.45 32.61 6.43 11.66 21.05 15.8 32.61 9.45 28.23-15.55 45.77-45 45.77-76.88s-17.54-61.32-45.78-76.86z"></path></svg> Verbalize what you are doing .footnote[[The Carpentries](https://carpentries.org/) is a global non-profit with the goal of increasing access to computational and data skills. You can become a certified [Instructor](https://carpentries.org/become-instructor/) by taking their training. Mine Çetinkaya-Rundel's [data science in a box](https://datasciencebox.org/hello/design-principles/) follows these principles, including "start with cake." ] ??? In the summer of 2019, I had the opportunity to get Carpentries certified, where I beefed up on data-driven practices for teaching coding, one of which is "don't touch the learners keyboard" and another is "verbalize what you are doing." These two practices go hand in hand, particularly when you're debugging code. And, they tie in with what Felienne was saying. If we are going to start with "sounding out" code, students will have fewer objects to hold in their working memory. --- # Pair programming .center[ <iframe width="800" height="500" src="https://www.youtube.com/embed/vgkahOzFH2Q" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe> ] .footnote[[Pair programming](https://www.youtube.com/watch?v=vgkahOzFH2Q) ] ??? One person "drives" (hands on keyboard), and the other "navigates" (helps guide). Common in computer science education, reminds me of Gilman's wrists and apprentices --- class: center, middle # Inherent documentation --- # Some R function pronunciations are clear ```r mean() summary() help() paste() ``` ??? Again, remembering that this is based on English --- # Others are... less so .pull-left[ ## str() ```r str(penguins) ``` - "ess tee arr penguins" - "stir penguins" ] .pull-right[ ## runif() ```r runif(4) ``` ``` ## [1] 0.6417073 0.9203537 0.5004719 0.2066657 ``` - "run-if four" (Nope!) - "r unif four" (Yep!) `randunif` might have been better ] ??? Trying to save characters... tapply, sqrt --- # "Standards for reading code out loud?" <div class="figure" style="text-align: center"> <img src="img/StackExchange1.png" alt="Screenshot of StackExchange post about standards for reading code outloud. Text in footnote of this slide." width="75%" /> <p class="caption">Screenshot of StackExchange post about standards for reading code outloud. Text in footnote of this slide.</p> </div> .footnote[[https://softwareengineering.stackexchange.com/questions/89833/standards-for-reading-code-out-loud](https://softwareengineering.stackexchange.com/questions/89833/standards-for-reading-code-out-loud) ] ??? "If you say "hash bang bin bash" or "shebang bash", just about everyone will know that means "#!/bin/bash". If they don't they'll say, "Huh?", and you step it down a notch "At the top of the file: Pound sign, exclamation mark, slash, bin, slash, bash, newline". If they still don't get it, you step it down yet again: "See that keyboard in front of you? See the "3" key? That mark on the top when you press shift is a pound sign, that."" --- # "Standards for reading code out loud?" <div class="figure" style="text-align: center"> <img src="img/StackExchange2.png" alt="Screenshot of StackExchange post about standards for reading code outloud. Text in footnote of this slide." width="75%" /> <p class="caption">Screenshot of StackExchange post about standards for reading code outloud. Text in footnote of this slide.</p> </div> .footnote[[https://softwareengineering.stackexchange.com/questions/89833/standards-for-reading-code-out-loud](https://softwareengineering.stackexchange.com/questions/89833/standards-for-reading-code-out-loud) ] ??? "I agree. I almost never read the code "word for word" I just explain what it is doing [...] But I would never try to type it with my tongue" I'll bring in the codinghorror page later. There are levels of verbalization for code --- class: center, middle # speaking R --- # Assignment operators .pull-left[ ```r a <- 4 ``` - "a gets four" - "a is four" - "set a to 4"] .pull-right[ ```r a = 4 ``` - "a equal four" - "a is four" - "a gets four" ] In tidyverse syntax, perhaps the right assignment operator makes more sense, ```r penguins %>% head() -> first_penguins ``` - "into"? - "gives"? ??? Okay, so maybe I've convinced you that we should be verbalizing code (either out loud, or at least in our heads), and that it would be good to be consistent. But, there are so many inconsistencies in how things are pronounced in R! Right assignment operator? "Participants in both groups followed some of the instructed vocalizations more frequently such as the variable's assignment (is)." Alaaeddin Swidan and Felienne Hermans. The Effect of Reading Code Aloud on Comprehension: An Empirical Study with School Students [CompEd '19: Proceedings of the ACM Conference on Global Computing Education](https://dl.acm.org/doi/10.1145/3300115.3309504)) --- # Sadly, I can't tell you "the" answer - LaTeX - gif ![Screenshot of the Merriam-Webster dictionary entry for the word gif](img/gif.png) .footnote[ Merriam-Webster [entry for the word gif](https://www.merriam-webster.com/dictionary/GIF) ] ??? I say "lay-tech" and "gif" but there are many other accepted pronunciations. Most important thing is consistency. --- class: middle >It’s a language for data analysis. And if you think that the language is a little incoherent, a little confusing, a bit of a maze, well then all I have to say is welcome to data analysis. > - Roger Peng, [useR 2018 keynote](https://www.youtube.com/watch?v=5033jBHFiHE) --- class: big-bullet # ASCII characters Sometimes, we just say the name of the ASCII character, but sometimes it has additional meaning in R. .footnote[[ASCII Pronunciation Rules for Programmers](https://blog.codinghorror.com/ascii-pronunciation-rules-for-programmers/)] - **"** quotation mark -- - **$** dollar sign -- - **!** exclamation mark, or "not" -- - **#** pound sign, number sign, or "comment" -- - **~** tilde, twiddle, or "by" -- - **|** bar, vertical bar, vbar, or "or" ??? Here's the coding horror reference comes back to levels of verbalization --- class: big-bullet # parentheses ```r head(penguins) ``` - "head open paren penguins close paren" - "head left paren penguins right paren" - function notation, `\(f(x)\)`, "f of x" - "head of penguins" --- # Functions that work well this way ## lm() ```r lm(bill_length_mm ~ flipper_length_mm, data = penguins) ``` ## plot() ```r plot(penguins$bill_length_mm, penguins$flipper_length_mm) plot(flipper_length_mm ~ bill_length_mm, data = penguins) ``` ??? "el em of em pee gee by double u tee, data equals em tee cars" --- # Less effective as things get more verbose ```r summary(lm(bill_length_mm ~ flipper_length_mm, data = penguins)) m1 <- lm(bill_length_mm ~ flipper_length_mm, data = penguins) summary(m1) ``` Much like `\(f(g(h(x)))\)` ??? This is more efficient, like Luke Tierney was saying in his keynote, but I don't think it's as readable. Even with the two-line approach, you need to figure out what `m1` refers to, almost like determining what a pronoun refers to in human language. In essence, you're doing the nesting yourself. --- class: big-bullet # %>% ```r penguins %>% head() ``` - "percent greater than percent" - "pipe" - "then" - "penguins then head" ??? Idea for pronunciation may have come from Heike. I struggle because I don't know how to say a line break. --- # %>%'s power comes from longer pipelines ```r foo_foo <- little_bunny() bop_on( scoop_up( hop_through(foo_foo, forest), field_mouse ), head ) # vs foo_foo %>% hop_through(forest) %>% scoop_up(field_mouse) %>% bop_on(head) ``` .footnote[Via Hadley Wickham's [Data Science with R](https://www.youtube.com/watch?v=K-ss_ag2k9E). Reed College, 2016.] ??? Less efficient in compute time, more efficient in human brains --- smart: false # "Ceci n'est pas un pipe" **|** is often thought of as "the pipe" (as in unix), but we use that symbol to mean "or" in R. ```r penguins %>% filter(species == "Adelie" | bill_length_mm > 50) ``` .pull-left[ <div class="figure"> <img src="img/pipe.png" alt="magrittr hex sticker, with %>% operator" width="50%" /> <p class="caption">magrittr hex sticker, with %>% operator</p> </div> ] .pull-right[ <div class="figure"> <img src="img/MagrittePipe.jpg" alt="Rene Magritte's painting, The Treachery of Images" width="110%" /> <p class="caption">Rene Magritte's painting, The Treachery of Images</p> </div> ] .footnote[[maggritr package](https://magrittr.tidyverse.org/), René Magritte's [The Treachery of Images](https://en.wikipedia.org/wiki/The_Treachery_of_Images)] ??? In his keynote yesterday, Luke Tierney talked about the possible addition of **|>** as a pipe in base R! --- class: center, middle # What makes learning language hard? --- ## homonyms, homophones, and homographs .pull-left[ ## homophones Pronounced the same, spelled differently, different meanings. - pear/pair - week/weak - meet/meat - sea/see ![gif from the TV show 30 Rock, of a male game show host saying "Sorry, it's the other one."](img/homonym.gif) ] .pull-right[ ## homographs Spelled the same, different pronunciation, different meaning. - bass - buffet - tear ] .footnote[gif from <a href="https://en.wikipedia.org/wiki/The_Beginning_of_the_End_(30_Rock)">30 Rock</a> ] ??? Homonyms can be either homophones or homographs. A more restrictive definition says they need to be **both**-- spelled the same, pronounced the same, different meanings. Bass drum, go fishing and catch a bass. Eat at the buffet, get buffeted about A tear ran down my face because I got a tear in my dress Felienne mentioned these in her keynote, too. --- # R homophones and homographs I have a habit of saying "then" to mean both `%>%` and "linebreak." Those both get pronounced the same, but are spelled very differently, and have different meanings. The vbar `|` is usually "or" ```r penguins %>% filter(species == "Chinstrap" | bill_length_mm > 50) ``` but in formula syntax, it takes on another meaning, "given." ```r gf_point(bill_length_mm ~ flipper_length_mm | sex, data = penguins) ``` --- # R homophones and homographs Periods are homonyms-- they sometimes they indicate a method, ```r plot.dendrogram() plot.factor() plot.lm() as.character() data.frame() ``` and sometimes are just delimiters, ```r read.csv() contrib.url() ``` ??? as.character, plot.data.frame, plot.dendrogram, etc. Usually read "dot." Homophone-- "then." Spelled differently, different meanings Homograph-- vbar. Spelled the same, but different meanings --- class: big-bullet # silent characters In English, silent letters show up in words like debt, hustle, knight, and many more. In R, there are characters we rarely pronounce. ```r lm(bill_length_mm ~ flipper_length_mm, data = penguins) ``` .pull-left[ - close paren - commas - spaces - linebreaks ] .pull-right[ - square brackets ```r letters[4] ``` - periods - underscores ```r read.csv() read_csv() ``` ] ??? Sometimes, people don't say characters that appear on the screen. I have heard both pronounced as "read cee ess vee" "Vocalizing the indentation spaces in a for-loop was among the least followed." Alaaeddin Swidan and Felienne Hermans. The Effect of Reading Code Aloud on Comprehension: An Empirical Study with School Students [CompEd '19: Proceedings of the ACM Conference on Global Computing Education](https://dl.acm.org/doi/10.1145/3300115.3309504) --- # Style We have style guides for written code, but no style guides for verbal code (yet!). Since the best practice for object names is snake case, we need a way to pronounce the underscore. ```r penguins$bill_length_mm ``` .pull-right[ <iframe width="504" height="315" src="https://www.youtube.com/embed/xJiHlt8NRqk?start=72" frameborder="0" allow="accelerometer; autoPlay="1"; mute="1"; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe> ] .footnote[[tidyverse style guide](https://style.tidyverse.org/), Victor Borge, [Phonetic Punctuation](https://www.youtube.com/embed/xJiHlt8NRqk) ] ??? "It was derived from Google’s original R Style Guide - but Google’s current guide is derived from the tidyverse style guide." No good way to pronounce capital letters, so camel case isn't better for verbalization --- class: center, middle # syntax ??? So, one way to judge a programming language, syntax, or DSL, is by it's "speakability." --- <div class="figure"> <img src="img/Quorum.png" alt="Figure from Stefik's paper, comparing Quorum, Perl, Randomo, and Python code for the same task" width="95%" /> <p class="caption">Figure from Stefik's paper, comparing Quorum, Perl, Randomo, and Python code for the same task</p> </div> .footnote[C-style languages (Perl, Java) were no better than Randomo, but non-C-style (Quorum, Python, Ruby) were. <br> Andreas Stefik and Susanna Siebert. An Empirical Investigation into Programming Language Syntax. [ACM Transactions on Computing Education, Volume 13 Number 4, 2013](https://dl.acm.org/doi/10.1145/2534973) ] ??? For this article, we conducted **four empirical studies on programming language syntax** as part of a larger analysis [...] two surveys [...] on the intuitiveness of syntax, two studies on the accuracy rates of novices using a total of six programming languages: Ruby, Java, Perl, Python, Randomo, and Quorum. Randomo was designed by randomly choosing some keywords from the ASCII table (a metaphorical placebo). To our surprise, **we found that languages using a more traditional C-style syntax** (both Perl and Java) **did not afford accuracy rates significantly higher than a language with randomly generated keywords**, **but that languages which deviate** (Quorum, Python, and Ruby) **did**. --- # data8 exercise 1 (python) ```python # Count how many times the names Jim, Tom, and Huck appear in each chapter. counts = Table().with_columns([ 'Jim', np.char.count(huck_finn_chapters, 'Jim'), 'Tom', np.char.count(huck_finn_chapters, 'Tom'), 'Huck', np.char.count(huck_finn_chapters, 'Huck') ]) # Plot the cumulative counts: # how many times in Chapter 1, how many times in Chapters 1 and 2, and so on. *cum_counts = counts.cumsum().with_column('Chapter', np.arange(1, 44, 1)) cum_counts.plot(column_for_xticks=3) plots.title('Cumulative Number of Times Each Name Appears', y=1.08); ``` .footnote[[data8.org](http://data8.org/), [data8 lesson 1.3](https://www.inferentialthinking.com/chapters/01/3/Plotting_the_Classics.html) ] ??? Data8 may be the largest data science class ever. Thousands of students take the course in person at UC Berkeley, thousands more on edX I'm not going to read you all this code. It takes a long time to get through. In a pedagogical setting, that time is not "wasted"-- it's necessary! But I don't think you need me to do it today. Looks like arrange is misspelled, but it's actually "a range." --- # Exercise ported to tidyverse R ```r # Count how many times the names Jim, Tom, and Huck appear in each chapter. counts <- huck_finn_chapters %>% filter(word %in% c("jim", "tom", "huck")) %>% group_by(chapter, word) %>% summarize(count = n()) # Plot the cumulative counts: # how many times in Chapter 1, how many times in Chapters 1 and 2, and so on. cum_counts <- counts %>% group_by(word) %>% mutate(cumulativesum = cumsum(count)) ggplot(cum_counts) + geom_line(aes(x = chapter, y = cumulativesum, color = word)) + ggtitle("Cumulative Number of Times Each Name Appears") ``` ??? Similarly, not going to read all this code to you. But, I think it is much more readable. I wouldn't start with this exercise for novices!! --- template: cheatsheet ??? >"Less volume, more creativity." > -Mike McCarthy / mosaic package philosophy --- # Summary statistics three ways **base** ```r mean(penguins$body_mass_g[penguins$species == "Adelie"]) mean(penguins$body_mass_g[penguins$species == "Chinstrap"]) mean(penguins$body_mass_g[penguins$species == "Gentoo"]) tapply(penguins$body_mass_g, penguins$species, mean) ``` **formula** ```r mean(body_mass_g ~ species, data = penguins) ``` **tidyverse** ```r penguins %>% group_by(species) %>% summarize(mean(body_mass_g)) ``` ??? The GAISE guidelines say "Give students experience with multivariable thinking." [GAISE guidelines](https://www.amstat.org/asa/education/Guidelines-for-Assessment-and-Instruction-in-Statistics-Education-Reports.aspx), for PreK-12, and college. Harder in base! --- # Scatterplot three ways **base** ```r plot(penguins$flipper_length_mm, penguins$bill_length_mm) ``` **formula** ```r xyplot(bill_length_mm ~ flipper_length_mm, data = penguins) gf_point(bill_length_mm ~ flipper_length_mm, data = penguins) ``` **tidyverse** ```r ggplot(penguins) + geom_point(aes(x = flipper_length_mm, y = bill_length_mm)) ``` --- # Sets of scatterplots three ways **base** ```r par(mfrow = c(1, 3)) plot(penguins$flipper_length_mm[penguins$species == "Adelie"], penguins$bill_length_mm[penguins$species == "Adelie"]) plot(penguins$flipper_length_mm[penguins$species == "Chinstrap"], penguins$bill_length_mm[penguins$species == "Chinstrap"]) plot(penguins$flipper_length_mm[penguins$species == "Gentoo"], penguins$bill_length_mm[penguins$species == "Gentoo"]) # apply solution? ``` **formula** ```r gf_point(bill_length_mm ~ flipper_length_mm | species, data = penguins) ``` **tidyverse** ```r ggplot(penguins, aes(x = flipper_length_mm, y = bill_length_mm)) + geom_point() + facet_grid(~species) ``` ??? In programming, if you are repeating yourself a lot, that probably means you can be more efficient. If you're speaking code, it gets especially tedious to repeat yourself! --- .pull-left[ <div class="figure"> <img src="img/syntax_WWW1.png" alt="Figure from Rafalinski's paper, showing the setup to the experiment for the formula syntax, and an example of the task" width="150%" /> <p class="caption">Figure from Rafalinski's paper, showing the setup to the experiment for the formula syntax, and an example of the task</p> </div> ] .pull-right[ <div class="figure"> <img src="img/syntax_WWW2.png" alt="Figure from Rafalinski's paper, showing a variety of student errors for the task in the previous figure." width="150%" /> <p class="caption">Figure from Rafalinski's paper, showing a variety of student errors for the task in the previous figure.</p> </div> ] .footnote[Timothy Rafalski, P. Merlin Uesbeck, Cristina Panks-Meloney, Patrick Daleiden, William Allee, Amelia McNamara, Andreas Stefik. "A Randomized Controlled Trial on the Wild Wild West of Scientific Computing with Student Learners." [ICER '19: Proceedings of the 2019 ACM Conference on International Computing Education Research July 2019 Pages 239–247](https://dl.acm.org/doi/10.1145/3291279.3339421) ] ??? tl;dr they (we?) didn't find a difference between base, formula, and tidyverse syntaxes in completion time or number of errors (qualitative or interpreter) When I look at the results, what I see is a lot of misunderstanding about variables and dataframes. No teaching! --- class: big-bullet # Another "experiment" - I've taught R **a lot**, including in introductory statistics labs. - all base R - all formula - all tidyverse - Spring 2020 was my first opportunity to teach introductory statistics labs at St Thomas - Decided to teach one lab in formula, one in tidyverse - Lab assignments are standardized across all labs (JMP, SPSS, Minitab, Excel, and R) - Pre-labs for formula and tidyverse are available on [GitHub](https://github.com/AmeliaMN/STAT220-labs) - Videos of labs 5-11 are available on my YouTube channel, [formula labs](https://www.youtube.com/playlist?list=PLik6fAQnSI90QbcUrjizKEn-eFbGM3MkP), [tidyverse labs](https://www.youtube.com/playlist?list=PLik6fAQnSI91S_rKq5T9KRgjHG-dClFzN) ??? Standardized labs meant I couldn't change what I asked based on syntax --- # Bootstrap ### tidyverse ```r library(infer) boot <- penguins %>% specify(response = flipper_length_mm) %>% generate(reps = 1000, type = "bootstrap") %>% calculate(stat = "mean") ``` ### formula ```r library(mosaic) boot <- do(1000) * mean(~flipper_length_mm, data = resample(penguins) ) ``` --- .pull-left[ **formula** - easy - introducing `lm()`, `aov()`, `chisq.test()`, etc after students were familiar with `tally()`, `mean()`, `gf_point()`, etc. (thanks, `mosaic` and `ggformula`!) - inference using distributional approximations, `prop.test()`, `t.test()` - hard - dealing with `NA` values - installing packages when we suddenly had to move off RStudio Cloud - data wrangling. I used `filter(penguins, body_mass_g>6000)` to avoid introducing the `%>%` ] .pull-right[ **tidyverse** - easy - explaining concepts from bootstrap and randomization (thanks, `infer`!) - installing packages when we suddenly had to move off RStudio Cloud - hard - explaining the difference between the `%>%` and `+` operators - inconsistency when we got to modeling, `lm()` and `aov()` - inference using distributional approximations (infer has `chisq_test()`, but nothing parallel to `prop.test()` or `t.test()`) ] **overall** - easy - explaining RMarkdown - debugging with hands off the keyboard (even after moving online!) - hard - **variables** Students would struggle to understand that `species` was the variable, not `Adelie`, `Chinstrap` and `Gentoo` (levels). - moving files from a local computer to RStudio Cloud - filepaths - students using the internet to troubleshoot (too much inconsistency online) ??? Overall, the formula syntax felt more consistent. The folks who work on mosaic, ggformula, etc., have made sure the entire introductory statistics curriculum can be accomplished using that syntax. Those students didn't have to see any dollar signs, and almost every single thing they saw used a formula. The tidyverse syntax feels more "useful" to me (bigger use in the wider community), but isn't quite ready for primetime when it comes to the entire intro stats curriculum. But, I didn't end up deciding that one was "better" and I'm going to teach both again in the fall. --- class: center, middle # So what? --- # Pronunciation guides for code? .pull-left[ <div class="figure"> <img src="img/xaringan.png" alt="Screenshot of the GitHub page for the xaringan package, including pronunciation guide." width="796" /> <p class="caption">Screenshot of the GitHub page for the xaringan package, including pronunciation guide.</p> </div> One way to standardize pronunciation is to use the International Phonetic Alphabet, like Yihui Xie has here on the GitHub page for xaringan. ] .pull-right[ <div class="figure"> <img src="img/IPA.jpg" alt="Guide to International Phonetic Alphabet" width="567" /> <p class="caption">Guide to International Phonetic Alphabet</p> </div> ] .footnote[ [International Phonetic Association](https://www.internationalphoneticassociation.org/), IPA image via [wikipedia](https://en.wikipedia.org/wiki/International_Phonetic_Alphabet). [GitHub page for xaringan](https://github.com/yihui/xaringan) ] --- class: big-bullet # Big ideas ```r lm(bill_length_mm ~ flipper_length_mm, data = penguins) ``` .pull-left[ - code is language - specifically, R code is language - consistency is key - code should be speakable - there are levels of verbalization for code - words are easy, symbols are hard - we need a style guide for speaking R ] .pull-right[ <div class="figure"> <img src="img/lter_penguins.png" alt="Drawing of three species of penguins to accompany the penguins data by Allison Horst" width="800" /> <p class="caption">Drawing of three species of penguins to accompany the penguins data by Allison Horst</p> </div> ] .footnote[[Penguin data](https://github.com/allisonhorst/palmerpenguins) and [penguin art](https://github.com/allisonhorst/palmerpenguins/tree/master/man/figures) by [Allison Horst](https://twitter.com/allison_horst) ] ??? When you are teaching, consider this. When you are developing new packages, new DSLs, new language elements, consider this. How will we pronounce the new pipe? --- class: title-slide, left, top background-image: url(img/comments.png) background-size: contain background-position: bottom left # Thank you ### Amelia McNamara, PhD ### Assistant Professor of Computer & <br>Information Sciences ### University of St Thomas<br>St Paul, MN, USA [<svg viewBox="0 0 512 512" style="height:1em;position:relative;display:inline-block;top:.1em;" xmlns="http://www.w3.org/2000/svg"> <path d="M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z"></path></svg> @AmeliaMN](https://twitter.com/AmeliaMN) [<svg viewBox="0 0 496 512" style="height:1em;position:relative;display:inline-block;top:.1em;" xmlns="http://www.w3.org/2000/svg"> <path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"></path></svg> AmeliaMN](www.github.com/AmeliaMN) ??? Thank you to - Stefik and graduate students - Sean, Julia, Ian, Jesse, Kara - useR organizing committee - you! for watching