├── .gitignore ├── 01-readr.Rmd ├── 02-tibble.Rmd ├── 03-ggplot2.Rmd ├── 04-dplyr.Rmd ├── 05-forcats.Rmd ├── 06-stringr.Rmd ├── 07-tidyr.Rmd ├── 08-purrr.Rmd ├── 2020-rladies-chi-tidyverse_files └── figure-html │ ├── unnamed-chunk-10-1.png │ ├── unnamed-chunk-11-1.png │ ├── unnamed-chunk-114-1.png │ ├── unnamed-chunk-116-1.png │ ├── unnamed-chunk-118-1.png │ ├── unnamed-chunk-119-1.png │ ├── unnamed-chunk-12-1.png │ ├── unnamed-chunk-120-1.png │ ├── unnamed-chunk-121-1.png │ ├── unnamed-chunk-13-1.png │ ├── unnamed-chunk-148-1.png │ ├── unnamed-chunk-149-1.png │ ├── unnamed-chunk-15-1.png │ ├── unnamed-chunk-152-1.png │ ├── unnamed-chunk-153-1.png │ ├── unnamed-chunk-154-1.png │ ├── unnamed-chunk-16-1.png │ ├── unnamed-chunk-160-1.png │ ├── unnamed-chunk-161-1.png │ ├── unnamed-chunk-164-1.png │ ├── unnamed-chunk-165-1.png │ ├── unnamed-chunk-166-1.png │ ├── unnamed-chunk-17-1.png │ ├── unnamed-chunk-18-1.png │ ├── unnamed-chunk-19-1.png │ ├── unnamed-chunk-20-1.png │ ├── unnamed-chunk-21-1.png │ ├── unnamed-chunk-22-1.png │ ├── unnamed-chunk-23-1.png │ ├── unnamed-chunk-24-1.png │ ├── unnamed-chunk-25-1.png │ ├── unnamed-chunk-27-1.png │ ├── unnamed-chunk-29-1.png │ ├── unnamed-chunk-30-1.png │ ├── unnamed-chunk-31-1.png │ ├── unnamed-chunk-32-1.png │ ├── unnamed-chunk-33-1.png │ ├── unnamed-chunk-34-1.png │ ├── unnamed-chunk-35-1.png │ ├── unnamed-chunk-36-1.png │ ├── unnamed-chunk-37-1.png │ ├── unnamed-chunk-38-1.png │ ├── unnamed-chunk-39-1.png │ ├── unnamed-chunk-41-1.png │ ├── unnamed-chunk-42-1.png │ ├── unnamed-chunk-43-1.png │ ├── unnamed-chunk-44-1.png │ ├── unnamed-chunk-47-1.png │ ├── unnamed-chunk-48-1.png │ ├── unnamed-chunk-49-1.png │ ├── unnamed-chunk-50-1.png │ ├── unnamed-chunk-51-1.png │ ├── unnamed-chunk-52-1.png │ ├── unnamed-chunk-53-1.png │ ├── unnamed-chunk-54-1.png │ ├── unnamed-chunk-55-1.png │ ├── unnamed-chunk-56-1.png │ ├── unnamed-chunk-57-1.png │ ├── unnamed-chunk-58-1.png │ ├── unnamed-chunk-59-1.png │ ├── unnamed-chunk-60-1.png │ ├── unnamed-chunk-61-1.png │ ├── unnamed-chunk-62-1.png │ ├── unnamed-chunk-64-1.png │ ├── unnamed-chunk-65-1.png │ ├── unnamed-chunk-66-1.png │ ├── unnamed-chunk-7-1.png │ ├── unnamed-chunk-8-1.png │ ├── unnamed-chunk-87-1.png │ ├── unnamed-chunk-88-1.png │ ├── unnamed-chunk-89-1.png │ ├── unnamed-chunk-9-1.png │ ├── unnamed-chunk-90-1.png │ ├── unnamed-chunk-91-1.png │ ├── unnamed-chunk-92-1.png │ ├── unnamed-chunk-93-1.png │ ├── unnamed-chunk-94-1.png │ └── unnamed-chunk-95-1.png ├── LICENSE.md ├── README.md ├── images ├── README-flipper-bill-1.png ├── README-flipper-hist-1.png ├── README-mass-flipper-1.png ├── antarctica.jpg ├── culmen_depth.png ├── hex │ ├── dplyr.png │ ├── forcats.png │ ├── ggplot2.png │ ├── purrr.png │ ├── readr.png │ ├── stringr.png │ ├── tibble.png │ ├── tidyr.png │ └── tidyverse.png ├── logo.png ├── lter_penguins.png ├── nord_frost.png ├── nord_multiple.png ├── palmerpenguins.png ├── penguin-fin.jpg ├── penguin_adelie.jpg ├── penguin_chinstrap.jpg ├── penguin_chinstrap_derekoyen.jpg ├── penguin_chinstrap_eamonnmaguire.jpg ├── penguin_gentoo.jpg ├── pptx │ ├── 01-readr.png │ ├── 02-tibble.png │ ├── 03-ggplot2.png │ ├── 04-dplyr.png │ ├── 05-forcats.png │ ├── 06-stringr.png │ ├── 07-tidyr.png │ ├── 08-purrr.png │ ├── tidyverse.png │ ├── tour-overview-lrg.png │ └── tour-overview-sml.png ├── r4ds-cover.png ├── title-slide.png └── wesanderson_example.png ├── index.html ├── libs ├── Proj4Leaflet │ ├── proj4-compressed.js │ └── proj4leaflet.js ├── clipboard │ └── clipboard.min.js ├── crosstalk │ ├── css │ │ └── crosstalk.css │ └── js │ │ ├── crosstalk.js │ │ ├── crosstalk.js.map │ │ ├── crosstalk.min.js │ │ └── crosstalk.min.js.map ├── datatables-binding │ └── datatables.js ├── datatables-css │ └── datatables-crosstalk.css ├── dt-core │ ├── css │ │ ├── jquery.dataTables.extra.css │ │ └── jquery.dataTables.min.css │ └── js │ │ └── jquery.dataTables.min.js ├── fitvids │ └── fitvids.min.js ├── font-awesome │ ├── css │ │ ├── fontawesome-all.css │ │ └── fontawesome-all.min.css │ ├── less │ │ ├── _animated.less │ │ ├── _bordered-pulled.less │ │ ├── _core.less │ │ ├── _fixed-width.less │ │ ├── _icons.less │ │ ├── _larger.less │ │ ├── _list.less │ │ ├── _mixins.less │ │ ├── _rotated-flipped.less │ │ ├── _screen-reader.less │ │ ├── _shims.less │ │ ├── _stacked.less │ │ ├── _variables.less │ │ ├── brands.less │ │ ├── fontawesome.less │ │ ├── regular.less │ │ ├── solid.less │ │ └── v4-shims.less │ ├── scss │ │ ├── _animated.scss │ │ ├── _bordered-pulled.scss │ │ ├── _core.scss │ │ ├── _fixed-width.scss │ │ ├── _icons.scss │ │ ├── _larger.scss │ │ ├── _list.scss │ │ ├── _mixins.scss │ │ ├── _rotated-flipped.scss │ │ ├── _screen-reader.scss │ │ ├── _shims.scss │ │ ├── _stacked.scss │ │ ├── _variables.scss │ │ ├── brands.scss │ │ ├── fontawesome.scss │ │ ├── regular.scss │ │ ├── solid.scss │ │ └── v4-shims.scss │ └── webfonts │ │ ├── fa-brands-400.eot │ │ ├── fa-brands-400.svg │ │ ├── fa-brands-400.ttf │ │ ├── fa-brands-400.woff │ │ ├── fa-brands-400.woff2 │ │ ├── fa-regular-400.eot │ │ ├── fa-regular-400.svg │ │ ├── fa-regular-400.ttf │ │ ├── fa-regular-400.woff │ │ ├── fa-regular-400.woff2 │ │ ├── fa-solid-900.eot │ │ ├── fa-solid-900.svg │ │ ├── fa-solid-900.ttf │ │ ├── fa-solid-900.woff │ │ └── fa-solid-900.woff2 ├── htmlwidgets │ └── htmlwidgets.js ├── jquery │ └── jquery.min.js ├── leaflet-binding │ └── leaflet.js ├── leaflet │ ├── images │ │ ├── layers-2x.png │ │ ├── layers.png │ │ ├── marker-icon-2x.png │ │ ├── marker-icon.png │ │ └── marker-shadow.png │ ├── leaflet.css │ └── leaflet.js ├── leafletfix │ └── leafletfix.css ├── panelset │ ├── panelset.css │ └── panelset.js ├── remark-css │ └── default.css ├── rstudio_leaflet │ ├── images │ │ └── 1px.png │ └── rstudio_leaflet.css ├── shareon │ ├── shareon.min.css │ └── shareon.min.js ├── tile-view │ ├── tile-view.css │ └── tile-view.js ├── xaringanExtra-clipboard │ ├── xaringanExtra-clipboard.css │ └── xaringanExtra-clipboard.js └── xaringanExtra-shareagain │ ├── shareagain.css │ └── shareagain.js ├── rladies-fonts-spc.css ├── rladies-spc.css ├── tour-of-the-tidyverse.Rmd ├── tour-of-the-tidyverse.Rproj ├── tour-of-the-tidyverse.html └── tutorial ├── raw_adelie.csv ├── tour-of-the-tidyverse.Rmd └── tour-of-the-tidyverse.nb.html /.gitignore: -------------------------------------------------------------------------------- 1 | .Rproj.user 2 | .Rhistory 3 | .RData 4 | .Ruserdata 5 | art.Rmd 6 | examples.Rmd 7 | intro.Rmd 8 | tour-of-the-tidyverse (silvia.canelon@pennmedicine.upenn.edu).html 9 | tour-of-tidyverse.pptx 10 | tour-of-tidyverse.ai 11 | -------------------------------------------------------------------------------- /01-readr.Rmd: -------------------------------------------------------------------------------- 1 | --- 2 | title: "01-readr" 3 | author: "Silvia P. Canelón" 4 | date: "9/19/2020" 5 | output: html_document 6 | --- 7 | 8 | class: penguin-tour 9 | 10 | ```{r, echo=FALSE, out.width=1200} 11 | knitr::include_graphics("images/pptx/01-readr.png") 12 | ``` 13 | 14 | .footnote[Photo by James Eades on Unsplash 15 | ] 16 | 17 | --- 18 | background-image: url(images/hex/readr.png) 19 | background-position: 1050px 50px 20 | background-size: 80px 21 | 22 | # readr: info 23 | 24 | .panelset[ 25 | 26 | .panel[.panel-name[Overview] 27 | 28 | .pull-left[ 29 | ### Importing data is the very first step!
You can use `readr` to import rectangular data. 30 | ] 31 | .pull-right[ 32 | ### You can import... 33 | 34 | - comma separated (CSV) files with `read_csv()` 35 | - tab separated files with `read_tsv()` 36 | - general delimited files with `read_delim()` 37 | - fixed width files with `read_fwf()` 38 | - tabular files where columns are separated by white-space with `read_table()` 39 | - web log files with `read_log()` 40 | 41 | ] 42 | ] 43 | 44 | .panel[.panel-name[Cheatsheet] 45 | 46 | `r icon::fa("file-pdf")` PDF: https://github.com/rstudio/cheatsheets/raw/master/data-import.pdf 47 | ![](https://raw.githubusercontent.com/rstudio/cheatsheets/master/pngs/thumbnails/data-import-cheatsheet-thumbs.png) 48 | ] 49 | 50 | .panel[.panel-name[Reading] 51 | 52 | .left-column[ 53 | ```{r echo=FALSE} 54 | knitr::include_graphics("images/r4ds-cover.png") 55 | ``` 56 | ] 57 | 58 | .right-column[ 59 | ### R for Data Science: [Ch 11 Data import](https://r4ds.had.co.nz/data-import.html) 60 | 61 | ### Package documentation: https://readr.tidyverse.org/ 62 | ] 63 | ] 64 | 65 | ] 66 | 67 | --- 68 | background-image: url(images/hex/readr.png) 69 | background-position: 1050px 50px 70 | background-size: 80px 71 | 72 | # readr: exercise 73 | 74 | .panelset[ 75 | .panel[.panel-name[Read data in] 76 | .center[ 77 | ### Both options below will get you the same dataset!] 78 | 79 | Option 1 80 | ```{r} 81 | # option 1: load using URL ---- 82 | raw_adelie_url <- read_csv("https://portal.edirepository.org/nis/dataviewer?packageid=knb-lter-pal.219.3&entityid=002f3893385f710df69eeebe893144ff") 83 | ``` 84 | 85 | Option 2 86 | ```{r} 87 | # option 2: load using filepath ---- 88 | raw_adelie_filepath <- read_csv("tutorial/raw_adelie.csv") 89 | ``` 90 | ] 91 | 92 | .panel[.panel-name[Save data] 93 | 94 | Lucky for us, the `palmerpenguins` `r emo::ji("package")` compiles data from all three species together for us! 95 | 96 | .pull-left[ 97 | `penguins` contains a clean dataset 98 | ```{r} 99 | # saves package tibble into global environment 100 | penguins <- palmerpenguins::penguins 101 | head(penguins) 102 | ``` 103 | ] 104 | .pull-right[ 105 | `penguins_raw` contains raw data 106 | ```{r} 107 | penguins_raw <- palmerpenguins::penguins_raw 108 | head(penguins_raw) 109 | ``` 110 | ] 111 | ] 112 | ] 113 | -------------------------------------------------------------------------------- /02-tibble.Rmd: -------------------------------------------------------------------------------- 1 | --- 2 | title: "02-tibble" 3 | author: "Silvia P. Canelón" 4 | date: "9/19/2020" 5 | output: html_document 6 | --- 7 | 8 | class: penguin-tour 9 | 10 | ```{r, echo=FALSE, out.width=1200} 11 | knitr::include_graphics("images/pptx/02-tibble.png") 12 | ``` 13 | 14 | .footnote[ 15 | Photo by James Eades on Unsplash 16 | ] 17 | 18 | --- 19 | background-image: url(images/hex/tibble.png) 20 | background-position: 1050px 50px 21 | background-size: 80px 22 | 23 | # tibble: info 24 | 25 | .panelset[ 26 | 27 | .panel[.panel-name[Overview] 28 | 29 | .pull-left[ 30 | ### A `tibble` is much like the `dataframe` in base R, but optimized for use in the Tidyverse. 31 | ] 32 | ] 33 | 34 | .panel[.panel-name[Cheatsheet] 35 | 36 | `r icon::fa("file-pdf")` PDF (tidyr): https://github.com/rstudio/cheatsheets/raw/master/data-transformation.pdf 37 | ![](https://raw.githubusercontent.com/rstudio/cheatsheets/master/pngs/thumbnails/data-import-cheatsheet-thumbs.png) 38 | ] 39 | 40 | .panel[.panel-name[Reading] 41 | 42 | .left-column[ 43 | ```{r echo=FALSE} 44 | knitr::include_graphics("images/r4ds-cover.png") 45 | ``` 46 | ] 47 | 48 | .right-column[ 49 | ### R for Data Science: [Ch 10 Tibbles](https://r4ds.had.co.nz/tibbles.html) 50 | 51 | ### Package documentation: https://tibble.tidyverse.org/ 52 | ] 53 | ] 54 | 55 | ] 56 | 57 | --- 58 | background-image: url(images/hex/tibble.png) 59 | background-position: 1050px 50px 60 | background-size: 80px 61 | 62 | # tibble: exercise 63 | 64 | .panelset[ 65 | .panel[.panel-name[Code] 66 | Let's take a look at the differences! 67 | ```{r eval=FALSE} 68 | # try each of these commands in the console and see if you can spot the differences! 69 | 70 | as_tibble(penguins) 71 | as.data.frame(penguins) 72 | ``` 73 | ] 74 | 75 | .panel[.panel-name[Result] 76 | .pull-left[ 77 | ```{r} 78 | as_tibble(penguins) 79 | ``` 80 | ] 81 | .pull-right[ 82 | ```{r} 83 | as.data.frame(penguins) 84 | ``` 85 | ] 86 | ] 87 | 88 | .panel[.panel-name[Chat] 89 | 90 | ### What differences do you see? 91 | 92 | You might see a `tibble` prints: 93 | - variable classes 94 | - only 10 rows 95 | - only as many columns as can fit on the screen 96 | - `NA`s are highlighted in console so they're easy to spot (font highlighting and styling in `tibble`) 97 | 98 | Not so much a concern in an R Markdown file, but noticeable in the console. 99 | Print method makes it easier to work with large datasets. 100 | 101 | ] 102 | 103 | .panel[.panel-name[More] 104 | There are a couple of other main differences, namely in **subsetting** and **recycling**. Check them out in the [`vignette("tibble")`](https://tibble.tidyverse.org/articles/tibble.html) 105 | 106 | Try it out here! 107 | ```{r eval=FALSE} 108 | vignette("tibble") 109 | ``` 110 | ] 111 | ] -------------------------------------------------------------------------------- /03-ggplot2.Rmd: -------------------------------------------------------------------------------- 1 | --- 2 | title: "03-ggplot2" 3 | author: "Silvia P. Canelón" 4 | date: "9/19/2020" 5 | output: html_document 6 | --- 7 | 8 | class: penguin-tour 9 | 10 | ```{r, echo=FALSE, out.width=1200} 11 | knitr::include_graphics("images/pptx/03-ggplot2.png") 12 | ``` 13 | 14 | .footnote[Photo by James Eades on Unsplash 15 | ] 16 | 17 | --- 18 | background-image: url(images/hex/ggplot2.png) 19 | background-position: 1050px 50px 20 | background-size: 80px 21 | 22 | # ggplot2: info 23 | 24 | .panelset[ 25 | .panel[.panel-name[Overview] 26 | ### Let's start by making a simple plot of our data! 27 | 28 | ### `ggplot2` uses the "Grammar of Graphics" and layers graphical components together to create a plot. 29 | ] 30 | 31 | .panel[.panel-name[Cheatsheet] 32 | 33 | `r icon::fa("file-pdf")` PDF: https://github.com/rstudio/cheatsheets/raw/master/data-visualization-2.1.pdf 34 | ![](https://raw.githubusercontent.com/rstudio/cheatsheets/master/pngs/thumbnails/data-visualization-cheatsheet-thumbs.png) 35 | ] 36 | 37 | .panel[.panel-name[Reading] 38 | 39 | .left-column[ 40 | ```{r echo=FALSE} 41 | knitr::include_graphics("images/r4ds-cover.png") 42 | ``` 43 | ] 44 | 45 | .right-column[ 46 | ### R for Data Science: [Ch 3 Data visualization](https://r4ds.had.co.nz/data-visualisation.html) 47 | 48 | ### Package documentation: https://ggplot2.tidyverse.org/ 49 | ] 50 | ] 51 | ] 52 | 53 | --- 54 | background-image: url(images/hex/ggplot2.png) 55 | background-position: 1050px 50px 56 | background-size: 80px 57 | 58 | # ggplot2: exercise 59 | 60 | .panelset[ 61 | .panel[.panel-name[View the data] 62 | 63 | .pull-left[ 64 | ### Get a full view of the dataset: 65 | ```{r eval=FALSE} 66 | View(penguins) 67 | ``` 68 | ] 69 | 70 | .pull-right[ 71 | ### Or catch a `glimpse`: 72 | ```{r} 73 | glimpse(penguins) 74 | ``` 75 | ] 76 | ] 77 | 78 | .panel[.panel-name[Scatterplot] 79 | 80 | Let's see if body mass varies by penguin sex 81 | 82 | .pull-left[ 83 | ```{r eval=FALSE} 84 | ggplot(data = penguins, 85 | aes(x = sex, y = body_mass_g)) + #<< 86 | geom_point() 87 | ``` 88 | ] 89 | 90 | .pull-right[ 91 | ```{r, echo=FALSE, warning=FALSE, fig.height=5} 92 | ggplot(data = penguins, 93 | aes(x = sex, y = body_mass_g)) + 94 | geom_point() 95 | ``` 96 | ] 97 | ] 98 | 99 | .panel[.panel-name[Boxplot] 100 | 101 | .pull-left[ 102 | ```{r eval=FALSE} 103 | ggplot(data = penguins, 104 | aes(x = sex, y = body_mass_g)) + 105 | geom_boxplot() #<< 106 | ``` 107 | ] 108 | 109 | .pull-right[ 110 | ```{r echo=FALSE, warning=FALSE, fig.height=5} 111 | ggplot(data = penguins, 112 | aes(x = sex, y = body_mass_g)) + 113 | geom_boxplot() 114 | ``` 115 | ] 116 | ] 117 | 118 | .panel[.panel-name[By Species] 119 | 120 | .pull-left[ 121 | ```{r eval=FALSE} 122 | ggplot(data = penguins, 123 | aes(x = sex, y = body_mass_g)) + 124 | geom_boxplot(aes(fill = species)) #<< 125 | ``` 126 | 127 | ###
What do you notice? 128 | ] 129 | 130 | .pull-right[ 131 | ```{r echo=FALSE, warning=FALSE, fig.height=5} 132 | ggplot(data = penguins, 133 | aes(x = sex, y = body_mass_g)) + 134 | geom_boxplot(aes(fill = species)) 135 | ``` 136 | ] 137 | ] 138 | 139 | .panel[.panel-name[Chat] 140 | 141 | ### You might see... 142 | 143 | .pull-left[ 144 | - Gentoo penguins have higher body mass than Adélie and Chinstrap penguins 145 | - Higher body mass among male Gentoo penguins compared to female penguins 146 | - Pattern not as discernible when comparing Adélie and Chinstrap penguins 147 | - No *NA*s among Chinstrap penguin data points! **sex** was available for each observation 148 | ] 149 | 150 | .pull-right[ 151 | ```{r echo=FALSE, warning=FALSE, fig.height=5} 152 | penguins %>% 153 | ggplot(aes(x = sex, y = body_mass_g)) + 154 | geom_boxplot(aes(fill = species)) 155 | ``` 156 | ] 157 | ] 158 | ] 159 | -------------------------------------------------------------------------------- /04-dplyr.Rmd: -------------------------------------------------------------------------------- 1 | --- 2 | title: "04-dplyr" 3 | author: "Silvia P. Canelón" 4 | date: "9/19/2020" 5 | output: html_document 6 | --- 7 | 8 | class: penguin-tour 9 | 10 | ```{r, echo=FALSE, out.width=1200} 11 | knitr::include_graphics("images/pptx/04-dplyr.png") 12 | ``` 13 | 14 | .footnote[Photo by James Eades on Unsplash 15 | ] 16 | 17 | --- 18 | background-image: url(images/hex/dplyr.png) 19 | background-position: 1050px 50px 20 | background-size: 80px 21 | 22 | # dplyr: info 23 | 24 | .panelset[ 25 | .panel[.panel-name[Overview] 26 | 27 | .pull-left[ 28 | ### Data transformation helps you get the data in exactly the right form you need.
With `dplyr` you can: 29 | 30 | - create new variables 31 | - create summaries 32 | - rename variables 33 | - reorder observations 34 | - ...and more! 35 | ] 36 | .pull-right[ 37 | - Pick observations by their values with `filter()`. 38 | - Reorder the rows with `arrange()`. 39 | - Pick variables by their names `select()`. 40 | - Create new variables with functions of existing variables with `mutate()`. 41 | - Collapse many values down to a single summary with `summarize()`. 42 | - `group_by()` gets the above functions to operate group-by-group rather than on the entire dataset. 43 | - and `count()` + `add_count()` simplify `group_by()` + `summarize()` when you just want to count 44 | ] 45 | ] 46 | 47 | .panel[.panel-name[Cheatsheet] 48 | 49 | `r icon::fa("file-pdf")` PDF: https://github.com/rstudio/cheatsheets/raw/master/data-transformation.pdf 50 | ![](https://raw.githubusercontent.com/rstudio/cheatsheets/master/pngs/thumbnails/data-transformation-cheatsheet-thumbs.png) 51 | ] 52 | 53 | .panel[.panel-name[Reading] 54 | 55 | .left-column[ 56 | ```{r echo=FALSE} 57 | knitr::include_graphics("images/r4ds-cover.png") 58 | ``` 59 | ] 60 | 61 | .right-column[ 62 | ### R for Data Science: [Ch 11 Data transformation](https://r4ds.had.co.nz/transform.html) 63 | 64 | ### Package documentation: https://dplyr.tidyverse.org/ 65 | ] 66 | ] 67 | ] 68 | 69 | --- 70 | background-image: url(images/hex/dplyr.png) 71 | background-position: 1050px 50px 72 | background-size: 80px 73 | 74 | # dplyr: exercise 75 | 76 | .panelset[ 77 | 78 | .panel[.panel-name[Select] 79 | .center[ 80 | ### Can you spot the difference in performing the same operation? 81 | ] 82 | .pull-left[ 83 | ```{r} 84 | select(penguins, species, sex, body_mass_g) 85 | ``` 86 | ] 87 | 88 | .pull-right[ 89 | ```{r} 90 | penguins %>% 91 | select(species, sex, body_mass_g) 92 | ``` 93 | ] 94 | ] 95 | 96 | .panel[.panel-name[Arrange] 97 | 98 | We can use `arrange()` to arrange our data in descending order by **body_mass_g** 99 | 100 | .pull-left[ 101 | ```{r} 102 | glimpse(penguins) 103 | ``` 104 | ] 105 | .pull-right[ 106 | ```{r} 107 | penguins %>% 108 | select(species, sex, body_mass_g) %>% 109 | arrange(desc(body_mass_g)) #<< 110 | ``` 111 | ] 112 | ] 113 | 114 | 115 | .panel[.panel-name[Group By & Summarize] 116 | 117 | .pull-left[ 118 | .middle[We can use `group_by()` to group our data by **species** and **sex**, and `summarize()` to calculate the average **body_mass_g** for each grouping.] 119 | ] 120 | 121 | .pull-right[ 122 | ```{r} 123 | penguins %>% 124 | select(species, sex, body_mass_g) %>% 125 | group_by(species, sex) %>% #<< 126 | summarize(mean = mean(body_mass_g)) #<< 127 | ``` 128 | ] 129 | ] 130 | 131 | 132 | .panel[.panel-name[Counting 1] 133 | If we're just interested in _counting_ the observations in each grouping, we can group and summarize with special functions `count()` and `add_count()`. 134 | 135 | ---- 136 | 137 | .pull-left[ 138 | Counting can be done with `group_by()` and `summarize()`, but it's a little cumbersome. 139 | 140 | It involves... 141 | 1. using `mutate()` to create an intermediate variable **n_species** that adds up all observations per **species**, and 142 | 2. an `ungroup()`-ing step 143 | ] 144 | 145 | .pull-right[ 146 | ```{r} 147 | penguins %>% 148 | group_by(species) %>% 149 | mutate(n_species = n()) %>% #<< 150 | ungroup() %>% #<< 151 | group_by(species, sex, n_species) %>% 152 | summarize(n = n()) 153 | ``` 154 | ] 155 | ] 156 | 157 | .panel[.panel-name[Counting 2] 158 | If we're just interested in _counting_ the observations in each grouping, we can group and summarize with special functions `count()` and `add_count()`. 159 | 160 | ---- 161 | 162 | .pull-left[ 163 | In contrast, `count()` and `add_count()` offer a simplified approach 164 | 165 | .small-text[Example kindly [contributed by Alison Hill (@apreshill)](https://github.com/spcanelon/2020-rladies-chi-tidyverse/issues/2)] 166 | ] 167 | .pull-right[ 168 | ```{r} 169 | penguins %>% 170 | count(species, sex) %>% 171 | add_count(species, wt = n, #<< 172 | name = "n_species") #<< 173 | ``` 174 | ] 175 | ] 176 | 177 | .panel[.panel-name[Mutate] 178 | 179 | .pull-left[ 180 | We can add to our counting example by using `mutate()` to create a new variable **prop**, which represents the proportion of penguins of each **sex**, grouped by **species** 181 | 182 | .small-text[Example kindly [contributed by Alison Hill (@apreshill)](https://github.com/spcanelon/2020-rladies-chi-tidyverse/issues/2)] 183 | ] 184 | .pull-right[ 185 | ```{r} 186 | penguins %>% 187 | count(species, sex) %>% 188 | add_count(species, wt = n, 189 | name = "n_species") %>% 190 | mutate(prop = n/n_species*100) #<< 191 | ``` 192 | ] 193 | ] 194 | 195 | .panel[.panel-name[Filter] 196 | 197 | .pull-left[ 198 | Finally, we can filter rows to only show us **Chinstrap** penguin summaries by adding `filter()` to our pipeline] 199 | 200 | .pull-right[ 201 | ```{r} 202 | penguins %>% 203 | count(species, sex) %>% 204 | add_count(species, wt = n, 205 | name = "n_species") %>% 206 | mutate(prop = n/n_species*100) %>% 207 | filter(species == "Chinstrap") #<< 208 | ``` 209 | ] 210 | ] 211 | 212 | ] 213 | -------------------------------------------------------------------------------- /05-forcats.Rmd: -------------------------------------------------------------------------------- 1 | --- 2 | title: "05-forcats" 3 | author: "Silvia P. Canelón" 4 | date: "9/19/2020" 5 | output: html_document 6 | --- 7 | 8 | class: penguin-tour 9 | 10 | ```{r, echo=FALSE, out.width=1200} 11 | knitr::include_graphics("images/pptx/05-forcats.png") 12 | ``` 13 | 14 | .footnote[Photo by James Eades on Unsplash 15 | ] 16 | 17 | --- 18 | background-image: url(images/hex/forcats.png) 19 | background-position: 1050px 50px 20 | background-size: 80px 21 | 22 | # forcats: info 23 | 24 | .panelset[ 25 | 26 | .panel[.panel-name[Overview] 27 | ### Helps us work with **categorical variables** or factors. 28 | 29 | ### These are variables that have a fixed and known set of possible values, like **species**, **island**, and **sex** in our `penguins` dataset. 30 | ] 31 | 32 | .panel[.panel-name[Cheatsheet] 33 | 34 | `r icon::fa("file-pdf")` PDF: https://github.com/rstudio/cheatsheets/raw/master/factors.pdf 35 | ![](https://raw.githubusercontent.com/rstudio/cheatsheets/master/pngs/thumbnails/forcats-cheatsheet-thumbs.png) 36 | ] 37 | 38 | .panel[.panel-name[Reading] 39 | 40 | .left-column[ 41 | ```{r echo=FALSE} 42 | knitr::include_graphics("images/r4ds-cover.png") 43 | ``` 44 | ] 45 | 46 | .right-column[ 47 | ### R for Data Science: [Ch 15 Factors](https://r4ds.had.co.nz/factors.html) 48 | 49 | ### Package documentation: https://forcats.tidyverse.org/ 50 | ] 51 | ] 52 | ] 53 | 54 | --- 55 | background-image: url(images/hex/forcats.png) 56 | background-position: 1050px 50px 57 | background-size: 80px 58 | 59 | # forcats: exercise 60 | 61 | .panelset[ 62 | .panel[.panel-name[Code] 63 | .pull-left[ 64 | ### Currently the **year** variable in `penguins` is continuous from 2007 to 2009. 65 | 66 | ### There may be situations where this isn't what we want and we might want to turn it into a categorical variable instead. 67 | ] 68 | 69 | .pull-right[ 70 | 71 | ### The `factor()` function is perfect for this. 72 | ```{r eval=FALSE} 73 | penguins %>% 74 | mutate(year_factor = 75 | factor(year, #<< 76 | levels = unique(year))) #<< 77 | ``` 78 | ] 79 | 80 | 81 | ] 82 | 83 | .panel[.panel-name[Result] 84 | ### The result is a new factor **year_factor** with levels **2007**, **2008**, and **2009** 85 | .pull-left[ 86 | ```{r} 87 | penguins_new <- 88 | penguins %>% 89 | mutate(year_factor = 90 | factor(year, #<< 91 | levels = unique(year))) #<< 92 | penguins_new 93 | ``` 94 | ] 95 | 96 | .pull-right[ 97 | ```{r} 98 | class(penguins_new$year_factor) 99 | 100 | levels(penguins_new$year_factor) 101 | ``` 102 | ] 103 | ] 104 | ] 105 | -------------------------------------------------------------------------------- /06-stringr.Rmd: -------------------------------------------------------------------------------- 1 | --- 2 | title: "06-stringr" 3 | author: "Silvia P. Canelón" 4 | date: "9/19/2020" 5 | output: html_document 6 | --- 7 | 8 | class: penguin-tour 9 | 10 | ```{r, echo=FALSE, out.width=1200} 11 | knitr::include_graphics("images/pptx/06-stringr.png") 12 | ``` 13 | 14 | .footnote[Photo by James Eades on Unsplash 15 | ] 16 | 17 | --- 18 | background-image: url(images/hex/stringr.png) 19 | background-position: 1050px 50px 20 | background-size: 80px 21 | 22 | # stringr: info 23 | 24 | .panelset[ 25 | 26 | .panel[.panel-name[Overview] 27 | 28 | .pull-left[ 29 | ### `stringr` helps us manipulate strings! The package includes many functions to help us with **regular expressions**, which are a concise language for describing patterns in strings. 30 | ] 31 | 32 | .pull-right[ 33 | ### These functions help us 34 | 35 | - detect matches 36 | - subset strings 37 | - manage string lengths 38 | - mutate strings 39 | - join and split strings 40 | - order strings 41 | - ...and more! 42 | ] 43 | 44 | ] 45 | 46 | .panel[.panel-name[Cheatsheet] 47 | 48 | `r icon::fa("file-pdf")` PDF: https://github.com/rstudio/cheatsheets/raw/master/strings.pdf 49 | ![](https://raw.githubusercontent.com/rstudio/cheatsheets/master/pngs/thumbnails/strings-cheatsheet-thumbs.png) 50 | ] 51 | 52 | .panel[.panel-name[Reading] 53 | 54 | .left-column[ 55 | ```{r echo=FALSE} 56 | knitr::include_graphics("images/r4ds-cover.png") 57 | ``` 58 | ] 59 | 60 | .right-column[ 61 | ### R for Data Science: [Ch 14 Strings](https://r4ds.had.co.nz/strings.html) 62 | 63 | ### Package documentation: https://stringr.tidyverse.org/ 64 | ] 65 | ] 66 | ] 67 | 68 | --- 69 | background-image: url(images/hex/stringr.png) 70 | background-position: 1050px 50px 71 | background-size: 80px 72 | 73 | # stringr: exercise 74 | 75 | .panelset[ 76 | .panel[.panel-name[Mutate] 77 | 78 | ### What does this chunk do? 79 | ```{r} 80 | penguins %>% 81 | select(species, island) %>% 82 | mutate(ISLAND = str_to_upper(island)) #<< 83 | ``` 84 | ] 85 | 86 | .panel[.panel-name[Join] 87 | 88 | ### How about this one? 89 | ```{r} 90 | penguins %>% 91 | select(species, island) %>% 92 | mutate(ISLAND = str_to_upper(island)) %>% 93 | mutate(species_island = str_c(species, ISLAND, sep = "_")) #<< 94 | ``` 95 | ] 96 | ] 97 | -------------------------------------------------------------------------------- /07-tidyr.Rmd: -------------------------------------------------------------------------------- 1 | --- 2 | title: "07-tidyr" 3 | author: "Silvia P. Canelón" 4 | date: "9/19/2020" 5 | output: html_document 6 | --- 7 | 8 | class: penguin-tour 9 | 10 | ```{r, echo=FALSE, out.width=1200} 11 | knitr::include_graphics("images/pptx/07-tidyr.png") 12 | ``` 13 | 14 | .footnote[Photo by James Eades on Unsplash 15 | ] 16 | 17 | --- 18 | background-image: url(images/hex/tidyr.png) 19 | background-position: 1050px 50px 20 | background-size: 80px 21 | 22 | # tidyr: info 23 | 24 | .panelset[ 25 | 26 | .panel[.panel-name[Overview] 27 | [From R for Data Science](https://r4ds.had.co.nz/tidy-data.html): 28 | 29 | > There are three interrelated rules which make a dataset tidy: 30 | 31 | > - Each variable must have its own column. 32 | > - Each observation must have its own row. 33 | > - Each value must have its own cell. 34 | ![](https://d33wubrfki0l68.cloudfront.net/6f1ddb544fc5c69a2478e444ab8112fb0eea23f8/91adc/images/tidy-1.png) 35 | 36 | ] 37 | 38 | .panel[.panel-name[Cheatsheet] 39 | 40 | `r icon::fa("file-pdf")` PDF: https://github.com/rstudio/cheatsheets/raw/master/data-import.pdf 41 | ![](https://raw.githubusercontent.com/rstudio/cheatsheets/master/pngs/thumbnails/data-import-cheatsheet-thumbs.png) 42 | ] 43 | 44 | .panel[.panel-name[Reading] 45 | 46 | .left-column[ 47 | ```{r echo=FALSE} 48 | knitr::include_graphics("images/r4ds-cover.png") 49 | ``` 50 | ] 51 | 52 | .right-column[ 53 | ### R for Data Science: [Ch 12 Tidy data](https://r4ds.had.co.nz/tidy-data.html) 54 | 55 | ### Package documentation: https://tidyr.tidyverse.org/ 56 | ] 57 | ] 58 | ] 59 | 60 | --- 61 | background-image: url(images/hex/tidyr.png) 62 | background-position: 1050px 50px 63 | background-size: 80px 64 | 65 | # tidyr: exercise 66 | 67 | .panelset[ 68 | .panel[.panel-name[Un-tidying] 69 | 70 | ### Both penguin datasets are already tidy! 71 | 72 | We can pretend that `penguins` wasn't tidy and that it looked instead like `untidy_penguins` below, where **body_mass_g** was recorded separately for *male*, *female*, and *NA* **sex** penguins. 73 | 74 | ```{r} 75 | untidy_penguins <- 76 | penguins %>% pivot_wider(names_from = sex, values_from = body_mass_g) 77 | untidy_penguins 78 | ``` 79 | 80 | ] 81 | 82 | .panel[.panel-name[Re-tidying] 83 | 84 | ### Now let's make it tidy again! 85 | 86 | We'll use the help of `pivot_longer()` 87 | 88 | ```{r} 89 | untidy_penguins %>% 90 | pivot_longer(cols = male:`NA`, #<< 91 | names_to = "sex", #<< 92 | values_to = "body_mass_g") #<< 93 | ``` 94 | ] 95 | ] -------------------------------------------------------------------------------- /08-purrr.Rmd: -------------------------------------------------------------------------------- 1 | --- 2 | title: "08-purrr" 3 | author: "Silvia P. Canelón" 4 | date: "9/19/2020" 5 | output: html_document 6 | --- 7 | 8 | class: penguin-tour 9 | 10 | ```{r, echo=FALSE, out.width=1200} 11 | knitr::include_graphics("images/pptx/08-purrr.png") 12 | ``` 13 | 14 | .footnote[Photo by James Eades on Unsplash 15 | ] 16 | 17 | --- 18 | background-image: url(images/hex/purrr.png) 19 | background-position: 1050px 50px 20 | background-size: 80px 21 | 22 | # purrr: info 23 | 24 | .panelset[ 25 | 26 | .panel[.panel-name[Overview] 27 | .pull-left[ 28 | ### Provides tools for working with functions and vectors 29 | 30 | ### The `purrr` family of functions helps us replace for loops, making our code easier to read and more succint. 31 | ] 32 | 33 | .pull-right[ 34 | ### With `purrr` you can 35 | 36 | - Iterate over a single input with `map()` 37 | - Iterate over two inputs in parallel with `map2()` 38 | - Iterate with multiple arguments with `pmap()` 39 | - Iterate with multiple arguments and functions with `invoke_map()` 40 | - Call a function for its side-effects with `walk()`, `walk2()`, and `pwalk()` 41 | ] 42 | ] 43 | 44 | .panel[.panel-name[Cheatsheet] 45 | 46 | `r icon::fa("file-pdf")` PDF: https://github.com/rstudio/cheatsheets/raw/master/purrr.pdf 47 | ![](https://raw.githubusercontent.com/rstudio/cheatsheets/master/pngs/thumbnails/purrr-cheatsheet-thumbs.png) 48 | ] 49 | 50 | .panel[.panel-name[Reading] 51 | 52 | .left-column[ 53 | ```{r echo=FALSE} 54 | knitr::include_graphics("images/r4ds-cover.png") 55 | ``` 56 | ] 57 | 58 | .right-column[ 59 | ### R for Data Science: [Ch 21 Iteration](https://r4ds.had.co.nz/iteration.html) 60 | 61 | ### Package documentation: https://purrr.tidyverse.org/ 62 | ] 63 | ] 64 | ] 65 | 66 | --- 67 | background-image: url(images/hex/purrr.png) 68 | background-position: 1050px 50px 69 | background-size: 80px 70 | 71 | # purrr: exercise 72 | 73 | .panelset[ 74 | .panel[.panel-name[Time for a change?] 75 | 76 | .pull-left[ 77 | ### Ok, we love our earlier boxplot showing us **body_mass_g** by **sex** and colored by **species**... but let's change up the colors to keep with our Antarctica theme! 78 | 79 | ### I'm a big fan of the color palettes in the `nord` `r emo::ji("package")` 80 | ] 81 | .pull-right[ 82 | ![](https://raw.githubusercontent.com/jkaupp/nord/master/man/figures/README-palettes-1.png) 83 | ] 84 | ] 85 | 86 | .panel[.panel-name[Goal] 87 | 88 | .pull-left[ 89 | ### Let's turn this plot 90 | ```{r echo=FALSE, warning=FALSE, fig.height=5} 91 | penguins %>% 92 | ggplot(aes(x = sex, y = body_mass_g)) + 93 | geom_boxplot(aes(fill = species)) 94 | ``` 95 | ] 96 | 97 | .pull-right[ 98 | ### Into this one! 99 | ```{r echo=FALSE, warning=FALSE, fig.height=5} 100 | penguins %>% 101 | ggplot(aes(x = sex, y = body_mass_g)) + 102 | geom_boxplot(aes(fill = species)) + 103 | scale_fill_manual(values = nord::nord_palettes$frost) 104 | ``` 105 | 106 | .panel[.panel-name[Option 1] 107 | 108 | .pull-left[ 109 | ```{r} 110 | library(nord) 111 | 112 | # you can choose colors using 113 | # the color hex codes 114 | nord::nord_palettes$frost 115 | ``` 116 | 117 | ```{r eval=FALSE} 118 | # and assign them using the 119 | # `scale_fill_manual()` function 120 | penguins %>% 121 | ggplot(aes(x = sex, y = body_mass_g)) + 122 | geom_boxplot(aes(fill = species)) + 123 | scale_fill_manual(values = c("#8FBCBB", "#88C0D0", "#81A1C1")) #<< 124 | ``` 125 | ] 126 | 127 | .pull-right[ 128 | ```{r echo=FALSE, fig.height=5} 129 | # and assign them using the `scale_fill_manual()` function 130 | penguins %>% 131 | ggplot(aes(x = sex, y = body_mass_g)) + 132 | geom_boxplot(aes(fill = species)) + 133 | scale_fill_manual(values = c("#8FBCBB", "#88C0D0", "#81A1C1")) 134 | ``` 135 | ] 136 | ] 137 | 138 | 139 | .panel[.panel-name[Options 2 & 3] 140 | 141 | .pull-left[ 142 | ...but you might prefer to use the palette name!
143 | ```{r eval=TRUE, warning=FALSE, fig.height=3, fig.width=5} 144 | penguins %>% 145 | ggplot(aes(x = sex, y = body_mass_g)) + 146 | geom_boxplot(aes(fill = species)) + 147 | scale_fill_manual(values = nord::nord_palettes$frost) #<< 148 | ``` 149 | ] 150 | 151 | .pull-right[ 152 | And some color palette packages also come with their own functions like `scale_fill_nord()` 153 | ```{r eval=TRUE, warning=FALSE, fig.height=3, fig.width=5} 154 | penguins %>% 155 | ggplot(aes(x = sex, y = body_mass_g)) + 156 | geom_boxplot(aes(fill = species)) + 157 | nord::scale_fill_nord(palette = "frost") #<< 158 | ``` 159 | ] 160 | ] 161 | 162 | .panel[.panel-name[Purrr?] 163 | 164 | .pull-left[ 165 | The `prismatic` `r emo::ji("package")` helps us **see** the colors that correspond to each color hex code (mostly), with the `color()` function 166 | 167 | ```{r} 168 | library(prismatic) 169 | ``` 170 | 171 | ```{r, warning=FALSE, eval=FALSE} 172 | prismatic::color(nord::nord_palettes$frost) 173 | ``` 174 | ![](images/nord_frost.png) 175 | ] 176 | 177 | .pull-right[ 178 | `purrr`'s `map()` function can help us iterate `color()` over all palettes in a palette package like `nord`! 179 | 180 | ```{r, eval = FALSE} 181 | nord::nord_palettes %>% map(prismatic::color) 182 | ``` 183 | 184 | ![](images/nord_multiple.png) 185 | ] 186 | ] 187 | ] 188 | ] 189 | 190 | .panel[.panel-name[More palettes!] 191 | 192 | .pull-left[ 193 | ### `r emo::ji("art")` [r-color-palettes repo](https://github.com/EmilHvitfeldt/r-color-palettes) from Emil Hvitfeldt 194 | 195 | ### Like this Wes Anderson themed one! And many, many others. `r emo::ji("star_struck")` 196 | ] 197 | 198 | .pull-right[ 199 | ![](images/wesanderson_example.png) 200 | ] 201 | ] 202 | 203 | ] -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-10-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-10-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-11-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-11-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-114-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-114-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-116-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-116-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-118-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-118-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-119-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-119-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-12-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-12-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-120-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-120-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-121-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-121-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-13-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-13-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-148-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-148-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-149-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-149-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-15-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-15-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-152-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-152-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-153-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-153-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-154-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-154-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-16-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-16-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-160-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-160-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-161-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-161-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-164-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-164-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-165-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-165-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-166-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-166-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-17-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-17-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-18-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-18-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-19-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-19-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-20-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-20-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-21-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-21-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-22-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-22-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-23-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-23-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-24-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-24-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-25-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-25-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-27-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-27-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-29-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-29-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-30-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-30-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-31-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-31-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-32-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-32-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-33-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-33-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-34-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-34-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-35-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-35-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-36-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-36-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-37-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-37-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-38-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-38-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-39-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-39-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-41-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-41-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-42-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-42-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-43-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-43-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-44-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-44-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-47-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-47-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-48-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-48-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-49-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-49-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-50-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-50-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-51-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-51-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-52-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-52-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-53-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-53-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-54-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-54-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-55-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-55-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-56-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-56-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-57-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-57-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-58-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-58-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-59-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-59-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-60-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-60-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-61-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-61-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-62-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-62-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-64-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-64-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-65-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-65-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-66-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-66-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-7-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-7-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-8-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-8-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-87-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-87-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-88-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-88-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-89-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-89-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-9-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-9-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-90-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-90-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-91-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-91-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-92-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-92-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-93-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-93-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-94-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-94-1.png -------------------------------------------------------------------------------- /2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-95-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/2020-rladies-chi-tidyverse_files/figure-html/unnamed-chunk-95-1.png -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | # License 2 | 3 | *This is a human-readable summary of (and not a substitute for) the license. 4 | Please see https://creativecommons.org/licenses/by-sa/4.0/legalcode for the full legal text.* 5 | 6 | This work is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0). 7 | 8 | **You are free to:** 9 | 10 | - **Share**---copy and redistribute the material in any medium or format 11 | 12 | - **Adapt**---remix, transform, and build upon the material for any purpose, 13 | even commercially. 14 | 15 | The licensor cannot revoke these freedoms as long as you follow the license terms. 16 | 17 | **Under the following terms:** 18 | 19 | - **Attribution**---You must give appropriate credit, provide a link to the license, 20 | and indicate if changes were made. You may do so in any reasonable manner, 21 | but not in any way that suggests the licensor endorses you or your use. 22 | 23 | - **ShareAlike**---If you remix, transform, or build upon the material, 24 | you must distribute your contributions under the same license as the original. 25 | 26 | **No additional restrictions**---You may not apply legal terms or technological measures that 27 | legally restrict others from doing anything the license permits. 28 | 29 | **Notices:** 30 | 31 | You do not have to comply with the license for elements of the material in the public domain 32 | or where your use is permitted by an applicable exception or limitation. 33 | 34 | No warranties are given. The license may not give you all of the 35 | permissions necessary for your intended use. For example, other rights 36 | such as publicity, privacy, or moral rights may limit how you use the 37 | material. 38 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![CC BY-SA 4.0][cc-by-sa-shield]][cc-by-sa] 2 | # An Antarctic Tour of the Tidyverse 3 | **An R tutorial created for a virtual R-Ladies Chicago event** 4 | 5 | Learn how to explore and manipulate data in R with packages from the Tidyverse. We'll introduce the [8 core packages](https://www.tidyverse.org/packages/) that make up the Tidyverse and use at least one function from each package while exploring a dataset on the migration of penguins from the [{palmerpenguins} package](https://allisonhorst.github.io/palmerpenguins/). 6 | 7 | ![Penguin artwork by @allison_horst](https://allisonhorst.github.io/palmerpenguins/reference/figures/lter_penguins.png) 8 | 9 | Credit: Penguin artwork by [@allison_horst](https://twitter.com/allison_horst) 10 | 11 | 12 | ## `palmerpenguins::penguins` available in other languages: 13 | ### Español (Spanish) -- [`{datos}`](https://cienciadedatos.github.io/datos/): [Tweet from Riva Quiroga](https://twitter.com/rivaquiroga/status/1295395634934099968?s=19) 14 | ### Português (Portuguese) -- [`{dados}`](https://cienciadedatos.github.io/dados/): [Tweet from Beatriz Milz](https://twitter.com/BeaMilz/status/1297632027416682496?s=19) 15 | 16 | ## Slides 17 | ### [spcanelon.github.io/tour-of-the-tidyverse](https://spcanelon.github.io/tour-of-the-tidyverse) 18 | 19 | ## Rmd Tutorial 20 | ### [tour-of-the-tidyverse.Rmd](https://github.com/spcanelon/2020-rladies-chi-tidyverse/blob/master/tutorial/tour-of-the-tidyverse.Rmd) 21 | 22 | ## Event page 23 | ### [meetup.com/rladies-chicago/events/272755101](https://www.meetup.com/rladies-chicago/events/272755101/) 24 | 25 | --- 26 | 27 | [![CC BY-SA 4.0][cc-by-sa-image]][cc-by-sa] 28 | 29 | This work is licensed under a 30 | [Creative Commons Attribution-ShareAlike 4.0 International License][cc-by-sa]. 31 | 32 | [cc-by-sa]: http://creativecommons.org/licenses/by-sa/4.0/ 33 | [cc-by-sa-image]: https://licensebuttons.net/l/by-sa/4.0/88x31.png 34 | [cc-by-sa-shield]: https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg 35 | -------------------------------------------------------------------------------- /images/README-flipper-bill-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/images/README-flipper-bill-1.png -------------------------------------------------------------------------------- /images/README-flipper-hist-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/images/README-flipper-hist-1.png -------------------------------------------------------------------------------- /images/README-mass-flipper-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/images/README-mass-flipper-1.png -------------------------------------------------------------------------------- /images/antarctica.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/images/antarctica.jpg -------------------------------------------------------------------------------- /images/culmen_depth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/images/culmen_depth.png -------------------------------------------------------------------------------- /images/hex/dplyr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/images/hex/dplyr.png -------------------------------------------------------------------------------- /images/hex/forcats.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/images/hex/forcats.png -------------------------------------------------------------------------------- /images/hex/ggplot2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/images/hex/ggplot2.png -------------------------------------------------------------------------------- /images/hex/purrr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/images/hex/purrr.png -------------------------------------------------------------------------------- /images/hex/readr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/images/hex/readr.png -------------------------------------------------------------------------------- /images/hex/stringr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/images/hex/stringr.png -------------------------------------------------------------------------------- /images/hex/tibble.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/images/hex/tibble.png -------------------------------------------------------------------------------- /images/hex/tidyr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/images/hex/tidyr.png -------------------------------------------------------------------------------- /images/hex/tidyverse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/images/hex/tidyverse.png -------------------------------------------------------------------------------- /images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/images/logo.png -------------------------------------------------------------------------------- /images/lter_penguins.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/images/lter_penguins.png -------------------------------------------------------------------------------- /images/nord_frost.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/images/nord_frost.png -------------------------------------------------------------------------------- /images/nord_multiple.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/images/nord_multiple.png -------------------------------------------------------------------------------- /images/palmerpenguins.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/images/palmerpenguins.png -------------------------------------------------------------------------------- /images/penguin-fin.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/images/penguin-fin.jpg -------------------------------------------------------------------------------- /images/penguin_adelie.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/images/penguin_adelie.jpg -------------------------------------------------------------------------------- /images/penguin_chinstrap.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/images/penguin_chinstrap.jpg -------------------------------------------------------------------------------- /images/penguin_chinstrap_derekoyen.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/images/penguin_chinstrap_derekoyen.jpg -------------------------------------------------------------------------------- /images/penguin_chinstrap_eamonnmaguire.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/images/penguin_chinstrap_eamonnmaguire.jpg -------------------------------------------------------------------------------- /images/penguin_gentoo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/images/penguin_gentoo.jpg -------------------------------------------------------------------------------- /images/pptx/01-readr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/images/pptx/01-readr.png -------------------------------------------------------------------------------- /images/pptx/02-tibble.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/images/pptx/02-tibble.png -------------------------------------------------------------------------------- /images/pptx/03-ggplot2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/images/pptx/03-ggplot2.png -------------------------------------------------------------------------------- /images/pptx/04-dplyr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/images/pptx/04-dplyr.png -------------------------------------------------------------------------------- /images/pptx/05-forcats.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/images/pptx/05-forcats.png -------------------------------------------------------------------------------- /images/pptx/06-stringr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/images/pptx/06-stringr.png -------------------------------------------------------------------------------- /images/pptx/07-tidyr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/images/pptx/07-tidyr.png -------------------------------------------------------------------------------- /images/pptx/08-purrr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/images/pptx/08-purrr.png -------------------------------------------------------------------------------- /images/pptx/tidyverse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/images/pptx/tidyverse.png -------------------------------------------------------------------------------- /images/pptx/tour-overview-lrg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/images/pptx/tour-overview-lrg.png -------------------------------------------------------------------------------- /images/pptx/tour-overview-sml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/images/pptx/tour-overview-sml.png -------------------------------------------------------------------------------- /images/r4ds-cover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/images/r4ds-cover.png -------------------------------------------------------------------------------- /images/title-slide.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/images/title-slide.png -------------------------------------------------------------------------------- /images/wesanderson_example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/images/wesanderson_example.png -------------------------------------------------------------------------------- /libs/Proj4Leaflet/proj4leaflet.js: -------------------------------------------------------------------------------- 1 | (function (factory) { 2 | var L, proj4; 3 | if (typeof define === 'function' && define.amd) { 4 | // AMD 5 | define(['leaflet', 'proj4'], factory); 6 | } else if (typeof module === 'object' && typeof module.exports === "object") { 7 | // Node/CommonJS 8 | L = require('leaflet'); 9 | proj4 = require('proj4'); 10 | module.exports = factory(L, proj4); 11 | } else { 12 | // Browser globals 13 | if (typeof window.L === 'undefined' || typeof window.proj4 === 'undefined') 14 | throw 'Leaflet and proj4 must be loaded first'; 15 | factory(window.L, window.proj4); 16 | } 17 | }(function (L, proj4) { 18 | if (proj4.__esModule && proj4.default) { 19 | // If proj4 was bundled as an ES6 module, unwrap it to get 20 | // to the actual main proj4 object. 21 | // See discussion in https://github.com/kartena/Proj4Leaflet/pull/147 22 | proj4 = proj4.default; 23 | } 24 | 25 | L.Proj = {}; 26 | 27 | L.Proj._isProj4Obj = function(a) { 28 | return (typeof a.inverse !== 'undefined' && 29 | typeof a.forward !== 'undefined'); 30 | }; 31 | 32 | L.Proj.Projection = L.Class.extend({ 33 | initialize: function(code, def, bounds) { 34 | var isP4 = L.Proj._isProj4Obj(code); 35 | this._proj = isP4 ? code : this._projFromCodeDef(code, def); 36 | this.bounds = isP4 ? def : bounds; 37 | }, 38 | 39 | project: function (latlng) { 40 | var point = this._proj.forward([latlng.lng, latlng.lat]); 41 | return new L.Point(point[0], point[1]); 42 | }, 43 | 44 | unproject: function (point, unbounded) { 45 | var point2 = this._proj.inverse([point.x, point.y]); 46 | return new L.LatLng(point2[1], point2[0], unbounded); 47 | }, 48 | 49 | _projFromCodeDef: function(code, def) { 50 | if (def) { 51 | proj4.defs(code, def); 52 | } else if (proj4.defs[code] === undefined) { 53 | var urn = code.split(':'); 54 | if (urn.length > 3) { 55 | code = urn[urn.length - 3] + ':' + urn[urn.length - 1]; 56 | } 57 | if (proj4.defs[code] === undefined) { 58 | throw 'No projection definition for code ' + code; 59 | } 60 | } 61 | 62 | return proj4(code); 63 | } 64 | }); 65 | 66 | L.Proj.CRS = L.Class.extend({ 67 | includes: L.CRS, 68 | 69 | options: { 70 | transformation: new L.Transformation(1, 0, -1, 0) 71 | }, 72 | 73 | initialize: function(a, b, c) { 74 | var code, 75 | proj, 76 | def, 77 | options; 78 | 79 | if (L.Proj._isProj4Obj(a)) { 80 | proj = a; 81 | code = proj.srsCode; 82 | options = b || {}; 83 | 84 | this.projection = new L.Proj.Projection(proj, options.bounds); 85 | } else { 86 | code = a; 87 | def = b; 88 | options = c || {}; 89 | this.projection = new L.Proj.Projection(code, def, options.bounds); 90 | } 91 | 92 | L.Util.setOptions(this, options); 93 | this.code = code; 94 | this.transformation = this.options.transformation; 95 | 96 | if (this.options.origin) { 97 | this.transformation = 98 | new L.Transformation(1, -this.options.origin[0], 99 | -1, this.options.origin[1]); 100 | } 101 | 102 | if (this.options.scales) { 103 | this._scales = this.options.scales; 104 | } else if (this.options.resolutions) { 105 | this._scales = []; 106 | for (var i = this.options.resolutions.length - 1; i >= 0; i--) { 107 | if (this.options.resolutions[i]) { 108 | this._scales[i] = 1 / this.options.resolutions[i]; 109 | } 110 | } 111 | } 112 | 113 | this.infinite = !this.options.bounds; 114 | 115 | }, 116 | 117 | scale: function(zoom) { 118 | var iZoom = Math.floor(zoom), 119 | baseScale, 120 | nextScale, 121 | scaleDiff, 122 | zDiff; 123 | if (zoom === iZoom) { 124 | return this._scales[zoom]; 125 | } else { 126 | // Non-integer zoom, interpolate 127 | baseScale = this._scales[iZoom]; 128 | nextScale = this._scales[iZoom + 1]; 129 | scaleDiff = nextScale - baseScale; 130 | zDiff = (zoom - iZoom); 131 | return baseScale + scaleDiff * zDiff; 132 | } 133 | }, 134 | 135 | zoom: function(scale) { 136 | // Find closest number in this._scales, down 137 | var downScale = this._closestElement(this._scales, scale), 138 | downZoom = this._scales.indexOf(downScale), 139 | nextScale, 140 | nextZoom, 141 | scaleDiff; 142 | // Check if scale is downScale => return array index 143 | if (scale === downScale) { 144 | return downZoom; 145 | } 146 | if (downScale === undefined) { 147 | return -Infinity; 148 | } 149 | // Interpolate 150 | nextZoom = downZoom + 1; 151 | nextScale = this._scales[nextZoom]; 152 | if (nextScale === undefined) { 153 | return Infinity; 154 | } 155 | scaleDiff = nextScale - downScale; 156 | return (scale - downScale) / scaleDiff + downZoom; 157 | }, 158 | 159 | distance: L.CRS.Earth.distance, 160 | 161 | R: L.CRS.Earth.R, 162 | 163 | /* Get the closest lowest element in an array */ 164 | _closestElement: function(array, element) { 165 | var low; 166 | for (var i = array.length; i--;) { 167 | if (array[i] <= element && (low === undefined || low < array[i])) { 168 | low = array[i]; 169 | } 170 | } 171 | return low; 172 | } 173 | }); 174 | 175 | L.Proj.GeoJSON = L.GeoJSON.extend({ 176 | initialize: function(geojson, options) { 177 | this._callLevel = 0; 178 | L.GeoJSON.prototype.initialize.call(this, geojson, options); 179 | }, 180 | 181 | addData: function(geojson) { 182 | var crs; 183 | 184 | if (geojson) { 185 | if (geojson.crs && geojson.crs.type === 'name') { 186 | crs = new L.Proj.CRS(geojson.crs.properties.name); 187 | } else if (geojson.crs && geojson.crs.type) { 188 | crs = new L.Proj.CRS(geojson.crs.type + ':' + geojson.crs.properties.code); 189 | } 190 | 191 | if (crs !== undefined) { 192 | this.options.coordsToLatLng = function(coords) { 193 | var point = L.point(coords[0], coords[1]); 194 | return crs.projection.unproject(point); 195 | }; 196 | } 197 | } 198 | 199 | // Base class' addData might call us recursively, but 200 | // CRS shouldn't be cleared in that case, since CRS applies 201 | // to the whole GeoJSON, inluding sub-features. 202 | this._callLevel++; 203 | try { 204 | L.GeoJSON.prototype.addData.call(this, geojson); 205 | } finally { 206 | this._callLevel--; 207 | if (this._callLevel === 0) { 208 | delete this.options.coordsToLatLng; 209 | } 210 | } 211 | } 212 | }); 213 | 214 | L.Proj.geoJson = function(geojson, options) { 215 | return new L.Proj.GeoJSON(geojson, options); 216 | }; 217 | 218 | L.Proj.ImageOverlay = L.ImageOverlay.extend({ 219 | initialize: function (url, bounds, options) { 220 | L.ImageOverlay.prototype.initialize.call(this, url, null, options); 221 | this._projectedBounds = bounds; 222 | }, 223 | 224 | // Danger ahead: Overriding internal methods in Leaflet. 225 | // Decided to do this rather than making a copy of L.ImageOverlay 226 | // and doing very tiny modifications to it. 227 | // Future will tell if this was wise or not. 228 | _animateZoom: function (event) { 229 | var scale = this._map.getZoomScale(event.zoom); 230 | var northWest = L.point(this._projectedBounds.min.x, this._projectedBounds.max.y); 231 | var offset = this._projectedToNewLayerPoint(northWest, event.zoom, event.center); 232 | 233 | L.DomUtil.setTransform(this._image, offset, scale); 234 | }, 235 | 236 | _reset: function () { 237 | var zoom = this._map.getZoom(); 238 | var pixelOrigin = this._map.getPixelOrigin(); 239 | var bounds = L.bounds( 240 | this._transform(this._projectedBounds.min, zoom)._subtract(pixelOrigin), 241 | this._transform(this._projectedBounds.max, zoom)._subtract(pixelOrigin) 242 | ); 243 | var size = bounds.getSize(); 244 | 245 | L.DomUtil.setPosition(this._image, bounds.min); 246 | this._image.style.width = size.x + 'px'; 247 | this._image.style.height = size.y + 'px'; 248 | }, 249 | 250 | _projectedToNewLayerPoint: function (point, zoom, center) { 251 | var viewHalf = this._map.getSize()._divideBy(2); 252 | var newTopLeft = this._map.project(center, zoom)._subtract(viewHalf)._round(); 253 | var topLeft = newTopLeft.add(this._map._getMapPanePos()); 254 | 255 | return this._transform(point, zoom)._subtract(topLeft); 256 | }, 257 | 258 | _transform: function (point, zoom) { 259 | var crs = this._map.options.crs; 260 | var transformation = crs.transformation; 261 | var scale = crs.scale(zoom); 262 | 263 | return transformation.transform(point, scale); 264 | } 265 | }); 266 | 267 | L.Proj.imageOverlay = function (url, bounds, options) { 268 | return new L.Proj.ImageOverlay(url, bounds, options); 269 | }; 270 | 271 | return L.Proj; 272 | })); 273 | -------------------------------------------------------------------------------- /libs/clipboard/clipboard.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * clipboard.js v2.0.6 3 | * https://clipboardjs.com/ 4 | * 5 | * Licensed MIT © Zeno Rocha 6 | */ 7 | !function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return o={},r.m=n=[function(t,e){t.exports=function(t){var e;if("SELECT"===t.nodeName)t.focus(),e=t.value;else if("INPUT"===t.nodeName||"TEXTAREA"===t.nodeName){var n=t.hasAttribute("readonly");n||t.setAttribute("readonly",""),t.select(),t.setSelectionRange(0,t.value.length),n||t.removeAttribute("readonly"),e=t.value}else{t.hasAttribute("contenteditable")&&t.focus();var o=window.getSelection(),r=document.createRange();r.selectNodeContents(t),o.removeAllRanges(),o.addRange(r),e=o.toString()}return e}},function(t,e){function n(){}n.prototype={on:function(t,e,n){var o=this.e||(this.e={});return(o[t]||(o[t]=[])).push({fn:e,ctx:n}),this},once:function(t,e,n){var o=this;function r(){o.off(t,r),e.apply(n,arguments)}return r._=e,this.on(t,r,n)},emit:function(t){for(var e=[].slice.call(arguments,1),n=((this.e||(this.e={}))[t]||[]).slice(),o=0,r=n.length;o .container-fluid.crosstalk-bscols { 12 | margin-left: auto; 13 | margin-right: auto; 14 | } 15 | 16 | .crosstalk-input-checkboxgroup .crosstalk-options-group .crosstalk-options-column { 17 | display: inline-block; 18 | padding-right: 12px; 19 | vertical-align: top; 20 | } 21 | 22 | @media only screen and (max-width:480px) { 23 | .crosstalk-input-checkboxgroup .crosstalk-options-group .crosstalk-options-column { 24 | display: block; 25 | padding-right: inherit; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /libs/datatables-css/datatables-crosstalk.css: -------------------------------------------------------------------------------- 1 | .dt-crosstalk-fade { 2 | opacity: 0.2; 3 | } 4 | 5 | html body div.DTS div.dataTables_scrollBody { 6 | background: none; 7 | } 8 | 9 | 10 | /* 11 | Fix https://github.com/rstudio/DT/issues/563 12 | If the `table.display` is set to "block" (e.g., pkgdown), the browser will display 13 | datatable objects strangely. The search panel and the page buttons will still be 14 | in full-width but the table body will be "compact" and shorter. 15 | In therory, having this attributes will affect `dom="t"` 16 | with `display: block` users. But in reality, there should be no one. 17 | We may remove the below lines in the future if the upstream agree to have this there. 18 | See https://github.com/DataTables/DataTablesSrc/issues/160 19 | */ 20 | 21 | table.dataTable { 22 | display: table; 23 | } 24 | -------------------------------------------------------------------------------- /libs/dt-core/css/jquery.dataTables.extra.css: -------------------------------------------------------------------------------- 1 | /* Selected rows/cells */ 2 | table.dataTable tr.selected td, table.dataTable td.selected { 3 | background-color: #b0bed9 !important; 4 | } 5 | /* In case of scrollX/Y or FixedHeader */ 6 | .dataTables_scrollBody .dataTables_sizing { 7 | visibility: hidden; 8 | } 9 | 10 | /* The datatables' theme CSS file doesn't define 11 | the color but with white background. It leads to an issue that 12 | when the HTML's body color is set to 'white', the user can't 13 | see the text since the background is white. One case happens in the 14 | RStudio's IDE when inline viewing the DT table inside an Rmd file, 15 | if the IDE theme is set to "Cobalt". 16 | 17 | See https://github.com/rstudio/DT/issues/447 for more info 18 | 19 | This fixes should have little side-effects because all the other elements 20 | of the default theme use the #333 font color. 21 | 22 | TODO: The upstream may use relative colors for both the table background 23 | and the color. It means the table can display well without this patch 24 | then. At that time, we need to remove the below CSS attributes. 25 | */ 26 | div.datatables { 27 | color: #333; 28 | } 29 | -------------------------------------------------------------------------------- /libs/dt-core/css/jquery.dataTables.min.css: -------------------------------------------------------------------------------- 1 | table.dataTable{width:100%;margin:0 auto;clear:both;border-collapse:separate;border-spacing:0}table.dataTable thead th,table.dataTable tfoot th{font-weight:bold}table.dataTable thead th,table.dataTable thead td{padding:10px 18px;border-bottom:1px solid #111}table.dataTable thead th:active,table.dataTable thead td:active{outline:none}table.dataTable tfoot th,table.dataTable tfoot td{padding:10px 18px 6px 18px;border-top:1px solid #111}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{cursor:pointer;*cursor:hand;background-repeat:no-repeat;background-position:center right}table.dataTable thead .sorting{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAAkElEQVQoz7XQMQ5AQBCF4dWQSJxC5wwax1Cq1e7BAdxD5SL+Tq/QCM1oNiJidwox0355mXnG/DrEtIQ6azioNZQxI0ykPhTQIwhCR+BmBYtlK7kLJYwWCcJA9M4qdrZrd8pPjZWPtOqdRQy320YSV17OatFC4euts6z39GYMKRPCTKY9UnPQ6P+GtMRfGtPnBCiqhAeJPmkqAAAAAElFTkSuQmCC)}table.dataTable thead .sorting_asc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZ0lEQVQ4y2NgGLKgquEuFxBPAGI2ahhWCsS/gDibUoO0gPgxEP8H4ttArEyuQYxAPBdqEAxPBImTY5gjEL9DM+wTENuQahAvEO9DMwiGdwAxOymGJQLxTyD+jgWDxCMZRsEoGAVoAADeemwtPcZI2wAAAABJRU5ErkJggg==)}table.dataTable thead .sorting_desc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZUlEQVQ4y2NgGAWjYBSggaqGu5FA/BOIv2PBIPFEUgxjB+IdQPwfC94HxLykus4GiD+hGfQOiB3J8SojEE9EM2wuSJzcsFMG4ttQgx4DsRalkZENxL+AuJQaMcsGxBOAmGvopk8AVz1sLZgg0bsAAAAASUVORK5CYII=)}table.dataTable thead .sorting_asc_disabled{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAAW0lEQVQoz2NgoCm4w3Vnwh02wspK7/y6k01Ikdadx3f+37l9RxmfIsY7c4GKQHDiHUbcyhzvvIMq+3THBpci3jv7oIpAcMcdduzKEu/8vPMdDn/eiWQYBYMKAAC3ykIEuYQJUgAAAABJRU5ErkJggg==)}table.dataTable thead .sorting_desc_disabled{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAAWUlEQVQoz2NgGAWDCtyJvPPzznc4/HknEbsy9js77vyHw313eHGZZ3PnE1TRuzuOuK1lvDMRqmzuHUZ87lO+cxuo6PEdLUIeyb7z604pYf+y3Zlwh4u2YQoAc7ZCBHH4jigAAAAASUVORK5CYII=)}table.dataTable tbody tr{background-color:#ffffff}table.dataTable tbody tr.selected{background-color:#B0BED9}table.dataTable tbody th,table.dataTable tbody td{padding:8px 10px}table.dataTable.row-border tbody th,table.dataTable.row-border tbody td,table.dataTable.display tbody th,table.dataTable.display tbody td{border-top:1px solid #ddd}table.dataTable.row-border tbody tr:first-child th,table.dataTable.row-border tbody tr:first-child td,table.dataTable.display tbody tr:first-child th,table.dataTable.display tbody tr:first-child td{border-top:none}table.dataTable.cell-border tbody th,table.dataTable.cell-border tbody td{border-top:1px solid #ddd;border-right:1px solid #ddd}table.dataTable.cell-border tbody tr th:first-child,table.dataTable.cell-border tbody tr td:first-child{border-left:1px solid #ddd}table.dataTable.cell-border tbody tr:first-child th,table.dataTable.cell-border tbody tr:first-child td{border-top:none}table.dataTable.stripe tbody tr.odd,table.dataTable.display tbody tr.odd{background-color:#f9f9f9}table.dataTable.stripe tbody tr.odd.selected,table.dataTable.display tbody tr.odd.selected{background-color:#acbad4}table.dataTable.hover tbody tr:hover,table.dataTable.display tbody tr:hover{background-color:#f6f6f6}table.dataTable.hover tbody tr:hover.selected,table.dataTable.display tbody tr:hover.selected{background-color:#aab7d1}table.dataTable.order-column tbody tr>.sorting_1,table.dataTable.order-column tbody tr>.sorting_2,table.dataTable.order-column tbody tr>.sorting_3,table.dataTable.display tbody tr>.sorting_1,table.dataTable.display tbody tr>.sorting_2,table.dataTable.display tbody tr>.sorting_3{background-color:#fafafa}table.dataTable.order-column tbody tr.selected>.sorting_1,table.dataTable.order-column tbody tr.selected>.sorting_2,table.dataTable.order-column tbody tr.selected>.sorting_3,table.dataTable.display tbody tr.selected>.sorting_1,table.dataTable.display tbody tr.selected>.sorting_2,table.dataTable.display tbody tr.selected>.sorting_3{background-color:#acbad5}table.dataTable.display tbody tr.odd>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd>.sorting_1{background-color:#f1f1f1}table.dataTable.display tbody tr.odd>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd>.sorting_2{background-color:#f3f3f3}table.dataTable.display tbody tr.odd>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd>.sorting_3{background-color:whitesmoke}table.dataTable.display tbody tr.odd.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_1{background-color:#a6b4cd}table.dataTable.display tbody tr.odd.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_2{background-color:#a8b5cf}table.dataTable.display tbody tr.odd.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_3{background-color:#a9b7d1}table.dataTable.display tbody tr.even>.sorting_1,table.dataTable.order-column.stripe tbody tr.even>.sorting_1{background-color:#fafafa}table.dataTable.display tbody tr.even>.sorting_2,table.dataTable.order-column.stripe tbody tr.even>.sorting_2{background-color:#fcfcfc}table.dataTable.display tbody tr.even>.sorting_3,table.dataTable.order-column.stripe tbody tr.even>.sorting_3{background-color:#fefefe}table.dataTable.display tbody tr.even.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_1{background-color:#acbad5}table.dataTable.display tbody tr.even.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_2{background-color:#aebcd6}table.dataTable.display tbody tr.even.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_3{background-color:#afbdd8}table.dataTable.display tbody tr:hover>.sorting_1,table.dataTable.order-column.hover tbody tr:hover>.sorting_1{background-color:#eaeaea}table.dataTable.display tbody tr:hover>.sorting_2,table.dataTable.order-column.hover tbody tr:hover>.sorting_2{background-color:#ececec}table.dataTable.display tbody tr:hover>.sorting_3,table.dataTable.order-column.hover tbody tr:hover>.sorting_3{background-color:#efefef}table.dataTable.display tbody tr:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_1{background-color:#a2aec7}table.dataTable.display tbody tr:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_2{background-color:#a3b0c9}table.dataTable.display tbody tr:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_3{background-color:#a5b2cb}table.dataTable.no-footer{border-bottom:1px solid #111}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}table.dataTable.compact thead th,table.dataTable.compact thead td{padding:4px 17px 4px 4px}table.dataTable.compact tfoot th,table.dataTable.compact tfoot td{padding:4px}table.dataTable.compact tbody th,table.dataTable.compact tbody td{padding:4px}table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center,table.dataTable td.dataTables_empty{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable,table.dataTable th,table.dataTable td{box-sizing:content-box}.dataTables_wrapper{position:relative;clear:both;*zoom:1;zoom:1}.dataTables_wrapper .dataTables_length{float:left}.dataTables_wrapper .dataTables_filter{float:right;text-align:right}.dataTables_wrapper .dataTables_filter input{margin-left:0.5em}.dataTables_wrapper .dataTables_info{clear:both;float:left;padding-top:0.755em}.dataTables_wrapper .dataTables_paginate{float:right;text-align:right;padding-top:0.25em}.dataTables_wrapper .dataTables_paginate .paginate_button{box-sizing:border-box;display:inline-block;min-width:1.5em;padding:0.5em 1em;margin-left:2px;text-align:center;text-decoration:none !important;cursor:pointer;*cursor:hand;color:#333 !important;border:1px solid transparent;border-radius:2px}.dataTables_wrapper .dataTables_paginate .paginate_button.current,.dataTables_wrapper .dataTables_paginate .paginate_button.current:hover{color:#333 !important;border:1px solid #979797;background-color:white;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #fff), color-stop(100%, #dcdcdc));background:-webkit-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-moz-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-ms-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-o-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:linear-gradient(to bottom, #fff 0%, #dcdcdc 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button.disabled,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active{cursor:default;color:#666 !important;border:1px solid transparent;background:transparent;box-shadow:none}.dataTables_wrapper .dataTables_paginate .paginate_button:hover{color:white !important;border:1px solid #111;background-color:#585858;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111));background:-webkit-linear-gradient(top, #585858 0%, #111 100%);background:-moz-linear-gradient(top, #585858 0%, #111 100%);background:-ms-linear-gradient(top, #585858 0%, #111 100%);background:-o-linear-gradient(top, #585858 0%, #111 100%);background:linear-gradient(to bottom, #585858 0%, #111 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button:active{outline:none;background-color:#2b2b2b;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));background:-webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%);box-shadow:inset 0 0 3px #111}.dataTables_wrapper .dataTables_paginate .ellipsis{padding:0 1em}.dataTables_wrapper .dataTables_processing{position:absolute;top:50%;left:50%;width:100%;height:40px;margin-left:-50%;margin-top:-25px;padding-top:20px;text-align:center;font-size:1.2em;background-color:white;background:-webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255,255,255,0)), color-stop(25%, rgba(255,255,255,0.9)), color-stop(75%, rgba(255,255,255,0.9)), color-stop(100%, rgba(255,255,255,0)));background:-webkit-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-moz-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-ms-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-o-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:linear-gradient(to right, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%)}.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter,.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_processing,.dataTables_wrapper .dataTables_paginate{color:#333}.dataTables_wrapper .dataTables_scroll{clear:both}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody{*margin-top:-1px;-webkit-overflow-scrolling:touch}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td{vertical-align:middle}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td>div.dataTables_sizing{height:0;overflow:hidden;margin:0 !important;padding:0 !important}.dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:1px solid #111}.dataTables_wrapper.no-footer div.dataTables_scrollHead table.dataTable,.dataTables_wrapper.no-footer div.dataTables_scrollBody>table{border-bottom:none}.dataTables_wrapper:after{visibility:hidden;display:block;content:"";clear:both;height:0}@media screen and (max-width: 767px){.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_paginate{float:none;text-align:center}.dataTables_wrapper .dataTables_paginate{margin-top:0.5em}}@media screen and (max-width: 640px){.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter{float:none;text-align:center}.dataTables_wrapper .dataTables_filter{margin-top:0.5em}} 2 | -------------------------------------------------------------------------------- /libs/fitvids/fitvids.min.js: -------------------------------------------------------------------------------- 1 | (function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.fitvids=f()}})(function(){var define,module,exports;return function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o0?ignored.join():null;var selector=selectors.concat(custom).join();if(!hasLength(selector)){return}containers.forEach(function(container){var videos=queryAll(container,selector);videos.forEach(function(video){if(ignoredSelector&&video.matches(ignoredSelector)){return}wrap(video)})})};function queryAll(el,selector){if(typeof el==="string"){selector=el;el=document}return Array.prototype.slice.call(el.querySelectorAll(selector))}function toSelectorArray(input){if(typeof input==="string"){return input.split(",").map(trim).filter(hasLength)}else if(isArray(input)){return flatten(input.map(toSelectorArray).filter(hasLength))}return input||[]}function wrap(el){if(/fluid-width-video-wrapper/.test(el.parentNode.className)){return}var widthAttr=parseInt(el.getAttribute("width"),10);var heightAttr=parseInt(el.getAttribute("height"),10);var width=!isNaN(widthAttr)?widthAttr:el.clientWidth;var height=!isNaN(heightAttr)?heightAttr:el.clientHeight;var aspect=height/width;el.removeAttribute("width");el.removeAttribute("height");var wrapper=document.createElement("div");el.parentNode.insertBefore(wrapper,el);wrapper.className="fluid-width-video-wrapper";wrapper.style.paddingTop=aspect*100+"%";wrapper.appendChild(el)}function styles(){var div=document.createElement("div");div.innerHTML='

x

";return div.childNodes[1]}function hasLength(input){return input.length>0}function trim(str){return str.replace(/^\s+|\s+$/g,"")}function flatten(input){return[].concat.apply([],input)}function isObject(input){return Object.prototype.toString.call(input)==="[object Object]"}function isArray(input){return Object.prototype.toString.call(input)==="[object Array]"}},{}]},{},[1])(1)}); -------------------------------------------------------------------------------- /libs/font-awesome/less/_animated.less: -------------------------------------------------------------------------------- 1 | // Animated Icons 2 | // -------------------------- 3 | 4 | .@{fa-css-prefix}-spin { 5 | animation: fa-spin 2s infinite linear; 6 | } 7 | 8 | .@{fa-css-prefix}-pulse { 9 | animation: fa-spin 1s infinite steps(8); 10 | } 11 | 12 | @keyframes fa-spin { 13 | 0% { 14 | transform: rotate(0deg); 15 | } 16 | 100% { 17 | transform: rotate(360deg); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /libs/font-awesome/less/_bordered-pulled.less: -------------------------------------------------------------------------------- 1 | // Bordered & Pulled 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-border { 5 | border-radius: .1em; 6 | border: solid .08em @fa-border-color; 7 | padding: .2em .25em .15em; 8 | } 9 | 10 | .@{fa-css-prefix}-pull-left { float: left; } 11 | .@{fa-css-prefix}-pull-right { float: right; } 12 | 13 | .@{fa-css-prefix}, .fas, .far, .fal, .fab { 14 | &.@{fa-css-prefix}-pull-left { margin-right: .3em; } 15 | &.@{fa-css-prefix}-pull-right { margin-left: .3em; } 16 | } 17 | -------------------------------------------------------------------------------- /libs/font-awesome/less/_core.less: -------------------------------------------------------------------------------- 1 | // Base Class Definition 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}, .fas, .far, .fal, .fab { 5 | -moz-osx-font-smoothing: grayscale; 6 | -webkit-font-smoothing: antialiased; 7 | display: inline-block; 8 | font-style: normal; 9 | font-variant: normal; 10 | text-rendering: auto; 11 | line-height: 1; 12 | } 13 | -------------------------------------------------------------------------------- /libs/font-awesome/less/_fixed-width.less: -------------------------------------------------------------------------------- 1 | // Fixed Width Icons 2 | // ------------------------- 3 | .@{fa-css-prefix}-fw { 4 | text-align: center; 5 | width: (20em / 16); 6 | } 7 | -------------------------------------------------------------------------------- /libs/font-awesome/less/_larger.less: -------------------------------------------------------------------------------- 1 | // Icon Sizes 2 | // ------------------------- 3 | 4 | .larger(@factor) when (@factor > 0) { 5 | .larger((@factor - 1)); 6 | 7 | .@{fa-css-prefix}-@{factor}x { 8 | font-size: (@factor * 1em); 9 | } 10 | } 11 | 12 | /* makes the font 33% larger relative to the icon container */ 13 | .@{fa-css-prefix}-lg { 14 | font-size: (4em / 3); 15 | line-height: (3em / 4); 16 | vertical-align: -.0667em; 17 | } 18 | 19 | .@{fa-css-prefix}-xs { 20 | font-size: .75em; 21 | } 22 | 23 | .@{fa-css-prefix}-sm { 24 | font-size: .875em; 25 | } 26 | 27 | .larger(10); 28 | -------------------------------------------------------------------------------- /libs/font-awesome/less/_list.less: -------------------------------------------------------------------------------- 1 | // List Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-ul { 5 | list-style-type: none; 6 | margin-left: @fa-li-width * 5/4; 7 | padding-left: 0; 8 | 9 | > li { position: relative; } 10 | } 11 | 12 | .@{fa-css-prefix}-li { 13 | left: -@fa-li-width; 14 | position: absolute; 15 | text-align: center; 16 | width: @fa-li-width; 17 | line-height: inherit; 18 | } 19 | -------------------------------------------------------------------------------- /libs/font-awesome/less/_mixins.less: -------------------------------------------------------------------------------- 1 | // Mixins 2 | // -------------------------- 3 | 4 | .fa-icon() { 5 | -moz-osx-font-smoothing: grayscale; 6 | -webkit-font-smoothing: antialiased; 7 | display: inline-block; 8 | font-style: normal; 9 | font-variant: normal; 10 | font-weight: normal; 11 | line-height: 1; 12 | vertical-align: -.125em; 13 | } 14 | 15 | .fa-icon-rotate(@degrees, @rotation) { 16 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation})"; 17 | transform: rotate(@degrees); 18 | } 19 | 20 | .fa-icon-flip(@horiz, @vert, @rotation) { 21 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation}, mirror=1)"; 22 | transform: scale(@horiz, @vert); 23 | } 24 | 25 | 26 | // Only display content to screen readers. A la Bootstrap 4. 27 | // 28 | // See: http://a11yproject.com/posts/how-to-hide-content/ 29 | 30 | .sr-only() { 31 | border: 0; 32 | clip: rect(0,0,0,0); 33 | height: 1px; 34 | margin: -1px; 35 | overflow: hidden; 36 | padding: 0; 37 | position: absolute; 38 | width: 1px; 39 | } 40 | 41 | // Use in conjunction with .sr-only to only display content when it's focused. 42 | // 43 | // Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 44 | // 45 | // Credit: HTML5 Boilerplate 46 | 47 | .sr-only-focusable() { 48 | &:active, 49 | &:focus { 50 | clip: auto; 51 | height: auto; 52 | margin: 0; 53 | overflow: visible; 54 | position: static; 55 | width: auto; 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /libs/font-awesome/less/_rotated-flipped.less: -------------------------------------------------------------------------------- 1 | // Rotated & Flipped Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); } 5 | .@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); } 6 | .@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); } 7 | 8 | .@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); } 9 | .@{fa-css-prefix}-flip-vertical { .fa-icon-flip(1, -1, 2); } 10 | .@{fa-css-prefix}-flip-horizontal.@{fa-css-prefix}-flip-vertical { .fa-icon-flip(-1, -1, 2); } 11 | 12 | // Hook for IE8-9 13 | // ------------------------- 14 | 15 | :root { 16 | .@{fa-css-prefix}-rotate-90, 17 | .@{fa-css-prefix}-rotate-180, 18 | .@{fa-css-prefix}-rotate-270, 19 | .@{fa-css-prefix}-flip-horizontal, 20 | .@{fa-css-prefix}-flip-vertical { 21 | filter: none; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /libs/font-awesome/less/_screen-reader.less: -------------------------------------------------------------------------------- 1 | // Screen Readers 2 | // ------------------------- 3 | 4 | .sr-only { .sr-only(); } 5 | .sr-only-focusable { .sr-only-focusable(); } 6 | -------------------------------------------------------------------------------- /libs/font-awesome/less/_stacked.less: -------------------------------------------------------------------------------- 1 | // Stacked Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-stack { 5 | display: inline-block; 6 | height: 2em; 7 | line-height: 2em; 8 | position: relative; 9 | vertical-align: middle; 10 | width: 2em; 11 | } 12 | 13 | .@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x { 14 | left: 0; 15 | position: absolute; 16 | text-align: center; 17 | width: 100%; 18 | } 19 | 20 | .@{fa-css-prefix}-stack-1x { line-height: inherit; } 21 | .@{fa-css-prefix}-stack-2x { font-size: 2em; } 22 | .@{fa-css-prefix}-inverse { color: @fa-inverse; } 23 | -------------------------------------------------------------------------------- /libs/font-awesome/less/brands.less: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.3.1 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @import "_variables.less"; 6 | 7 | @font-face { 8 | font-family: 'Font Awesome 5 Brands'; 9 | font-style: normal; 10 | font-weight: normal; 11 | src: url('@{fa-font-path}/fa-brands-400.eot'); 12 | src: url('@{fa-font-path}/fa-brands-400.eot?#iefix') format('embedded-opentype'), 13 | url('@{fa-font-path}/fa-brands-400.woff2') format('woff2'), 14 | url('@{fa-font-path}/fa-brands-400.woff') format('woff'), 15 | url('@{fa-font-path}/fa-brands-400.ttf') format('truetype'), 16 | url('@{fa-font-path}/fa-brands-400.svg#fontawesome') format('svg'); 17 | } 18 | 19 | .fab { 20 | font-family: 'Font Awesome 5 Brands'; 21 | } 22 | -------------------------------------------------------------------------------- /libs/font-awesome/less/fontawesome.less: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.3.1 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @import "_variables.less"; 6 | @import "_mixins.less"; 7 | @import "_core.less"; 8 | @import "_larger.less"; 9 | @import "_fixed-width.less"; 10 | @import "_list.less"; 11 | @import "_bordered-pulled.less"; 12 | @import "_animated.less"; 13 | @import "_rotated-flipped.less"; 14 | @import "_stacked.less"; 15 | @import "_icons.less"; 16 | @import "_screen-reader.less"; 17 | -------------------------------------------------------------------------------- /libs/font-awesome/less/regular.less: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.3.1 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @import "_variables.less"; 6 | 7 | @font-face { 8 | font-family: 'Font Awesome 5 Free'; 9 | font-style: normal; 10 | font-weight: 400; 11 | src: url('@{fa-font-path}/fa-regular-400.eot'); 12 | src: url('@{fa-font-path}/fa-regular-400.eot?#iefix') format('embedded-opentype'), 13 | url('@{fa-font-path}/fa-regular-400.woff2') format('woff2'), 14 | url('@{fa-font-path}/fa-regular-400.woff') format('woff'), 15 | url('@{fa-font-path}/fa-regular-400.ttf') format('truetype'), 16 | url('@{fa-font-path}/fa-regular-400.svg#fontawesome') format('svg'); 17 | } 18 | 19 | .far { 20 | font-family: 'Font Awesome 5 Free'; 21 | font-weight: 400; 22 | } 23 | -------------------------------------------------------------------------------- /libs/font-awesome/less/solid.less: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.3.1 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @import "_variables.less"; 6 | 7 | @font-face { 8 | font-family: 'Font Awesome 5 Free'; 9 | font-style: normal; 10 | font-weight: 900; 11 | src: url('@{fa-font-path}/fa-solid-900.eot'); 12 | src: url('@{fa-font-path}/fa-solid-900.eot?#iefix') format('embedded-opentype'), 13 | url('@{fa-font-path}/fa-solid-900.woff2') format('woff2'), 14 | url('@{fa-font-path}/fa-solid-900.woff') format('woff'), 15 | url('@{fa-font-path}/fa-solid-900.ttf') format('truetype'), 16 | url('@{fa-font-path}/fa-solid-900.svg#fontawesome') format('svg'); 17 | } 18 | 19 | .fa, 20 | .fas { 21 | font-family: 'Font Awesome 5 Free'; 22 | font-weight: 900; 23 | } 24 | -------------------------------------------------------------------------------- /libs/font-awesome/less/v4-shims.less: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.3.1 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @import '_variables.less'; 6 | @import '_shims.less'; 7 | -------------------------------------------------------------------------------- /libs/font-awesome/scss/_animated.scss: -------------------------------------------------------------------------------- 1 | // Animated Icons 2 | // -------------------------- 3 | 4 | .#{$fa-css-prefix}-spin { 5 | animation: fa-spin 2s infinite linear; 6 | } 7 | 8 | .#{$fa-css-prefix}-pulse { 9 | animation: fa-spin 1s infinite steps(8); 10 | } 11 | 12 | @keyframes fa-spin { 13 | 0% { 14 | transform: rotate(0deg); 15 | } 16 | 17 | 100% { 18 | transform: rotate(360deg); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /libs/font-awesome/scss/_bordered-pulled.scss: -------------------------------------------------------------------------------- 1 | // Bordered & Pulled 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-border { 5 | border: solid .08em $fa-border-color; 6 | border-radius: .1em; 7 | padding: .2em .25em .15em; 8 | } 9 | 10 | .#{$fa-css-prefix}-pull-left { float: left; } 11 | .#{$fa-css-prefix}-pull-right { float: right; } 12 | 13 | .#{$fa-css-prefix}, 14 | .fas, 15 | .far, 16 | .fal, 17 | .fab { 18 | &.#{$fa-css-prefix}-pull-left { margin-right: .3em; } 19 | &.#{$fa-css-prefix}-pull-right { margin-left: .3em; } 20 | } 21 | -------------------------------------------------------------------------------- /libs/font-awesome/scss/_core.scss: -------------------------------------------------------------------------------- 1 | // Base Class Definition 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}, 5 | .fas, 6 | .far, 7 | .fal, 8 | .fab { 9 | -moz-osx-font-smoothing: grayscale; 10 | -webkit-font-smoothing: antialiased; 11 | display: inline-block; 12 | font-style: normal; 13 | font-variant: normal; 14 | text-rendering: auto; 15 | line-height: 1; 16 | } 17 | 18 | %fa-icon { 19 | @include fa-icon; 20 | } 21 | -------------------------------------------------------------------------------- /libs/font-awesome/scss/_fixed-width.scss: -------------------------------------------------------------------------------- 1 | // Fixed Width Icons 2 | // ------------------------- 3 | .#{$fa-css-prefix}-fw { 4 | text-align: center; 5 | width: (20em / 16); 6 | } 7 | -------------------------------------------------------------------------------- /libs/font-awesome/scss/_larger.scss: -------------------------------------------------------------------------------- 1 | // Icon Sizes 2 | // ------------------------- 3 | 4 | // makes the font 33% larger relative to the icon container 5 | .#{$fa-css-prefix}-lg { 6 | font-size: (4em / 3); 7 | line-height: (3em / 4); 8 | vertical-align: -.0667em; 9 | } 10 | 11 | .#{$fa-css-prefix}-xs { 12 | font-size: .75em; 13 | } 14 | 15 | .#{$fa-css-prefix}-sm { 16 | font-size: .875em; 17 | } 18 | 19 | @for $i from 1 through 10 { 20 | .#{$fa-css-prefix}-#{$i}x { 21 | font-size: $i * 1em; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /libs/font-awesome/scss/_list.scss: -------------------------------------------------------------------------------- 1 | // List Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-ul { 5 | list-style-type: none; 6 | margin-left: $fa-li-width * 5/4; 7 | padding-left: 0; 8 | 9 | > li { position: relative; } 10 | } 11 | 12 | .#{$fa-css-prefix}-li { 13 | left: -$fa-li-width; 14 | position: absolute; 15 | text-align: center; 16 | width: $fa-li-width; 17 | line-height: inherit; 18 | } 19 | -------------------------------------------------------------------------------- /libs/font-awesome/scss/_mixins.scss: -------------------------------------------------------------------------------- 1 | // Mixins 2 | // -------------------------- 3 | 4 | @mixin fa-icon { 5 | -webkit-font-smoothing: antialiased; 6 | -moz-osx-font-smoothing: grayscale; 7 | display: inline-block; 8 | font-style: normal; 9 | font-variant: normal; 10 | font-weight: normal; 11 | line-height: 1; 12 | vertical-align: -.125em; 13 | } 14 | 15 | @mixin fa-icon-rotate($degrees, $rotation) { 16 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation})"; 17 | transform: rotate($degrees); 18 | } 19 | 20 | @mixin fa-icon-flip($horiz, $vert, $rotation) { 21 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}, mirror=1)"; 22 | transform: scale($horiz, $vert); 23 | } 24 | 25 | 26 | // Only display content to screen readers. A la Bootstrap 4. 27 | // 28 | // See: http://a11yproject.com/posts/how-to-hide-content/ 29 | 30 | @mixin sr-only { 31 | border: 0; 32 | clip: rect(0, 0, 0, 0); 33 | height: 1px; 34 | margin: -1px; 35 | overflow: hidden; 36 | padding: 0; 37 | position: absolute; 38 | width: 1px; 39 | } 40 | 41 | // Use in conjunction with .sr-only to only display content when it's focused. 42 | // 43 | // Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 44 | // 45 | // Credit: HTML5 Boilerplate 46 | 47 | @mixin sr-only-focusable { 48 | &:active, 49 | &:focus { 50 | clip: auto; 51 | height: auto; 52 | margin: 0; 53 | overflow: visible; 54 | position: static; 55 | width: auto; 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /libs/font-awesome/scss/_rotated-flipped.scss: -------------------------------------------------------------------------------- 1 | // Rotated & Flipped Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); } 5 | .#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); } 6 | .#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); } 7 | 8 | .#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); } 9 | .#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); } 10 | .#{$fa-css-prefix}-flip-horizontal.#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(-1, -1, 2); } 11 | 12 | // Hook for IE8-9 13 | // ------------------------- 14 | 15 | :root { 16 | .#{$fa-css-prefix}-rotate-90, 17 | .#{$fa-css-prefix}-rotate-180, 18 | .#{$fa-css-prefix}-rotate-270, 19 | .#{$fa-css-prefix}-flip-horizontal, 20 | .#{$fa-css-prefix}-flip-vertical { 21 | filter: none; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /libs/font-awesome/scss/_screen-reader.scss: -------------------------------------------------------------------------------- 1 | // Screen Readers 2 | // ------------------------- 3 | 4 | .sr-only { @include sr-only; } 5 | .sr-only-focusable { @include sr-only-focusable; } 6 | -------------------------------------------------------------------------------- /libs/font-awesome/scss/_stacked.scss: -------------------------------------------------------------------------------- 1 | // Stacked Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-stack { 5 | display: inline-block; 6 | height: 2em; 7 | line-height: 2em; 8 | position: relative; 9 | vertical-align: middle; 10 | width: 2em; 11 | } 12 | 13 | .#{$fa-css-prefix}-stack-1x, 14 | .#{$fa-css-prefix}-stack-2x { 15 | left: 0; 16 | position: absolute; 17 | text-align: center; 18 | width: 100%; 19 | } 20 | 21 | .#{$fa-css-prefix}-stack-1x { 22 | line-height: inherit; 23 | } 24 | 25 | .#{$fa-css-prefix}-stack-2x { 26 | font-size: 2em; 27 | } 28 | 29 | .#{$fa-css-prefix}-inverse { 30 | color: $fa-inverse; 31 | } 32 | -------------------------------------------------------------------------------- /libs/font-awesome/scss/brands.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.3.1 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @import 'variables'; 6 | 7 | @font-face { 8 | font-family: 'Font Awesome 5 Brands'; 9 | font-style: normal; 10 | font-weight: normal; 11 | src: url('#{$fa-font-path}/fa-brands-400.eot'); 12 | src: url('#{$fa-font-path}/fa-brands-400.eot?#iefix') format('embedded-opentype'), 13 | url('#{$fa-font-path}/fa-brands-400.woff2') format('woff2'), 14 | url('#{$fa-font-path}/fa-brands-400.woff') format('woff'), 15 | url('#{$fa-font-path}/fa-brands-400.ttf') format('truetype'), 16 | url('#{$fa-font-path}/fa-brands-400.svg#fontawesome') format('svg'); 17 | } 18 | 19 | .fab { 20 | font-family: 'Font Awesome 5 Brands'; 21 | } 22 | -------------------------------------------------------------------------------- /libs/font-awesome/scss/fontawesome.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.3.1 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @import 'variables'; 6 | @import 'mixins'; 7 | @import 'core'; 8 | @import 'larger'; 9 | @import 'fixed-width'; 10 | @import 'list'; 11 | @import 'bordered-pulled'; 12 | @import 'animated'; 13 | @import 'rotated-flipped'; 14 | @import 'stacked'; 15 | @import 'icons'; 16 | @import 'screen-reader'; 17 | -------------------------------------------------------------------------------- /libs/font-awesome/scss/regular.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.3.1 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @import 'variables'; 6 | 7 | @font-face { 8 | font-family: 'Font Awesome 5 Free'; 9 | font-style: normal; 10 | font-weight: 400; 11 | src: url('#{$fa-font-path}/fa-regular-400.eot'); 12 | src: url('#{$fa-font-path}/fa-regular-400.eot?#iefix') format('embedded-opentype'), 13 | url('#{$fa-font-path}/fa-regular-400.woff2') format('woff2'), 14 | url('#{$fa-font-path}/fa-regular-400.woff') format('woff'), 15 | url('#{$fa-font-path}/fa-regular-400.ttf') format('truetype'), 16 | url('#{$fa-font-path}/fa-regular-400.svg#fontawesome') format('svg'); 17 | } 18 | 19 | .far { 20 | font-family: 'Font Awesome 5 Free'; 21 | font-weight: 400; 22 | } 23 | -------------------------------------------------------------------------------- /libs/font-awesome/scss/solid.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.3.1 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @import 'variables'; 6 | 7 | @font-face { 8 | font-family: 'Font Awesome 5 Free'; 9 | font-style: normal; 10 | font-weight: 900; 11 | src: url('#{$fa-font-path}/fa-solid-900.eot'); 12 | src: url('#{$fa-font-path}/fa-solid-900.eot?#iefix') format('embedded-opentype'), 13 | url('#{$fa-font-path}/fa-solid-900.woff2') format('woff2'), 14 | url('#{$fa-font-path}/fa-solid-900.woff') format('woff'), 15 | url('#{$fa-font-path}/fa-solid-900.ttf') format('truetype'), 16 | url('#{$fa-font-path}/fa-solid-900.svg#fontawesome') format('svg'); 17 | } 18 | 19 | .fa, 20 | .fas { 21 | font-family: 'Font Awesome 5 Free'; 22 | font-weight: 900; 23 | } 24 | -------------------------------------------------------------------------------- /libs/font-awesome/scss/v4-shims.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.3.1 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @import 'variables'; 6 | @import 'shims'; 7 | -------------------------------------------------------------------------------- /libs/font-awesome/webfonts/fa-brands-400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/libs/font-awesome/webfonts/fa-brands-400.eot -------------------------------------------------------------------------------- /libs/font-awesome/webfonts/fa-brands-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/libs/font-awesome/webfonts/fa-brands-400.ttf -------------------------------------------------------------------------------- /libs/font-awesome/webfonts/fa-brands-400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/libs/font-awesome/webfonts/fa-brands-400.woff -------------------------------------------------------------------------------- /libs/font-awesome/webfonts/fa-brands-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/libs/font-awesome/webfonts/fa-brands-400.woff2 -------------------------------------------------------------------------------- /libs/font-awesome/webfonts/fa-regular-400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/libs/font-awesome/webfonts/fa-regular-400.eot -------------------------------------------------------------------------------- /libs/font-awesome/webfonts/fa-regular-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/libs/font-awesome/webfonts/fa-regular-400.ttf -------------------------------------------------------------------------------- /libs/font-awesome/webfonts/fa-regular-400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/libs/font-awesome/webfonts/fa-regular-400.woff -------------------------------------------------------------------------------- /libs/font-awesome/webfonts/fa-regular-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/libs/font-awesome/webfonts/fa-regular-400.woff2 -------------------------------------------------------------------------------- /libs/font-awesome/webfonts/fa-solid-900.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/libs/font-awesome/webfonts/fa-solid-900.eot -------------------------------------------------------------------------------- /libs/font-awesome/webfonts/fa-solid-900.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/libs/font-awesome/webfonts/fa-solid-900.ttf -------------------------------------------------------------------------------- /libs/font-awesome/webfonts/fa-solid-900.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/libs/font-awesome/webfonts/fa-solid-900.woff -------------------------------------------------------------------------------- /libs/font-awesome/webfonts/fa-solid-900.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/libs/font-awesome/webfonts/fa-solid-900.woff2 -------------------------------------------------------------------------------- /libs/leaflet/images/layers-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/libs/leaflet/images/layers-2x.png -------------------------------------------------------------------------------- /libs/leaflet/images/layers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/libs/leaflet/images/layers.png -------------------------------------------------------------------------------- /libs/leaflet/images/marker-icon-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/libs/leaflet/images/marker-icon-2x.png -------------------------------------------------------------------------------- /libs/leaflet/images/marker-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/libs/leaflet/images/marker-icon.png -------------------------------------------------------------------------------- /libs/leaflet/images/marker-shadow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/libs/leaflet/images/marker-shadow.png -------------------------------------------------------------------------------- /libs/leafletfix/leafletfix.css: -------------------------------------------------------------------------------- 1 | /* Work around CSS properties introduced on img by bootstrap */ 2 | img.leaflet-tile { 3 | padding: 0; 4 | margin: 0; 5 | border-radius: 0; 6 | border: none; 7 | } 8 | .info { 9 | padding: 6px 8px; 10 | font: 14px/16px Arial, Helvetica, sans-serif; 11 | background: white; 12 | background: rgba(255,255,255,0.8); 13 | box-shadow: 0 0 15px rgba(0,0,0,0.2); 14 | border-radius: 5px; 15 | } 16 | .legend { 17 | line-height: 18px; 18 | color: #555; 19 | } 20 | .legend svg text { 21 | fill: #555; 22 | } 23 | .legend svg line { 24 | stroke: #555; 25 | } 26 | .legend i { 27 | width: 18px; 28 | height: 18px; 29 | margin-right: 4px; 30 | opacity: 0.7; 31 | display: inline-block; 32 | vertical-align: top; 33 | /*For IE 7*/ 34 | zoom: 1; 35 | *display: inline; 36 | } 37 | -------------------------------------------------------------------------------- /libs/panelset/panelset.css: -------------------------------------------------------------------------------- 1 | /* prefixed by https://autoprefixer.github.io (PostCSS: v7.0.23, autoprefixer: v9.7.3) */ 2 | 3 | .panelset { 4 | width: 100%; 5 | position: relative; 6 | --panel-tabs-border-bottom: #ddd; 7 | --panel-tab-foreground: currentColor; 8 | --panel-tab-background: unset; 9 | --panel-tab-active-foreground: currentColor; 10 | --panel-tab-active-background: unset; 11 | --panel-tab-hover-foreground: currentColor; 12 | --panel-tab-hover-background: unset; 13 | --panel-tab-active-border-color: currentColor; 14 | --panel-tab-hover-border-color: currentColor; 15 | --panel-tab-inactive-opacity: 0.5; 16 | --panel-tab-font-family: inherit; 17 | } 18 | 19 | .panelset * { 20 | box-sizing: border-box; 21 | } 22 | 23 | .panelset .panel-tabs { 24 | display: -webkit-box; 25 | display: flex; 26 | flex-wrap: wrap; 27 | -webkit-box-orient: horizontal; 28 | -webkit-box-direction: normal; 29 | flex-direction: row; 30 | -webkit-box-pack: start; 31 | justify-content: start; 32 | -webkit-box-align: center; 33 | align-items: center; 34 | overflow-y: visible; 35 | overflow-x: auto; 36 | -webkit-overflow-scrolling: touch; 37 | padding: 0 0 2px 0; 38 | box-shadow: inset 0 -2px 0px var(--panel-tabs-border-bottom); 39 | } 40 | 41 | .panelset .panel-tabs * { 42 | -webkit-transition: opacity 0.5s ease; 43 | transition: opacity 0.5s ease; 44 | } 45 | 46 | .panelset .panel-tabs .panel-tab { 47 | min-height: 50px; 48 | display: -webkit-box; 49 | display: flex; 50 | -webkit-box-pack: center; 51 | justify-content: center; 52 | -webkit-box-align: center; 53 | align-items: center; 54 | padding: 0.5em 1em; 55 | font-family: var(--panel-tab-font-family); 56 | opacity: var(--panel-tab-inactive-opacity); 57 | border-top: 2px solid transparent; 58 | border-bottom: 2px solid transparent; 59 | margin-bottom: -2px; 60 | color: var(--panel-tab-foreground); 61 | background-color: var(--panel-tab-background); 62 | list-style: none; 63 | z-index: 5; 64 | } 65 | 66 | .panelset .panel-tabs .panel-tab > a { 67 | color: currentColor; 68 | text-decoration: none; 69 | border: none; 70 | } 71 | 72 | .panelset .panel-tabs .panel-tab > a:focus { 73 | outline: none; 74 | text-decoration: none; 75 | border: none; 76 | } 77 | 78 | .panelset .panel-tabs .panel-tab > a:hover { 79 | text-decoration: none; 80 | border: none; 81 | } 82 | 83 | .panelset .panel-tabs .panel-tab:hover { 84 | border-bottom-color: var(--panel-tab-hover-border-color); 85 | color: var(--panel-tab-hover-foreground); 86 | background-color: var(--panel-tab-hover-background); 87 | opacity: 1; 88 | cursor: pointer; 89 | z-index: 10; 90 | } 91 | 92 | .panelset .panel-tabs .panel-tab:focus { 93 | outline: none; 94 | color: var(--panel-tab-hover-foreground); 95 | border-bottom-color: var(--panel-tab-hover-border-color); 96 | background-color: var(--panel-tab-hover-background); 97 | } 98 | 99 | .panelset .panel-tabs .panel-tab.panel-tab-active { 100 | border-top-color: var(--panel-tab-active-border-color); 101 | color: var(--panel-tab-active-foreground); 102 | background-color: var(--panel-tab-active-background); 103 | opacity: 1; 104 | } 105 | 106 | .panelset .panel { 107 | display: none; 108 | } 109 | 110 | .panelset .panel-active { 111 | display: block; 112 | } 113 | -------------------------------------------------------------------------------- /libs/panelset/panelset.js: -------------------------------------------------------------------------------- 1 | /* global slideshow */ 2 | (function () { 3 | const ready = function (fn) { 4 | /* MIT License Copyright (c) 2016 Nuclei */ 5 | /* https://github.com/nuclei/readyjs */ 6 | const completed = () => { 7 | document.removeEventListener('DOMContentLoaded', completed) 8 | window.removeEventListener('load', completed) 9 | fn() 10 | } 11 | if (document.readyState !== 'loading') { 12 | setTimeout(fn) 13 | } else { 14 | document.addEventListener('DOMContentLoaded', completed) 15 | window.addEventListener('load', completed) 16 | } 17 | } 18 | 19 | ready(function () { 20 | [...document.querySelectorAll('.panel-name')] 21 | .map(el => el.textContent.trim()) 22 | 23 | const panelIds = {} 24 | 25 | const uniquePanelId = (name) => { 26 | name = encodeURIComponent(name.toLowerCase().replace(/[\s]/g, '-')) 27 | if (Object.keys(panelIds).includes(name)) { 28 | name += ++panelIds[name] 29 | } else { 30 | panelIds[name] = 1 31 | } 32 | return name 33 | } 34 | 35 | const identifyPanelName = (item) => { 36 | let name = 'Panel' 37 | 38 | // If the item doesn't have a parent element, then we've already processed 39 | // it, probably because we're in an Rmd, and it's been removed from the DOM 40 | if (!item.parentElement) { 41 | return 42 | } 43 | 44 | // In R Markdown when header-attrs.js is present, we may have found a 45 | // section header but the class attributes won't be duplicated on the tag 46 | if ( 47 | (item.tagName === 'SECTION' || item.classList.contains('section')) && 48 | /^H[1-6]/.test(item.children[0].tagName) 49 | ) { 50 | name = item.children[0].textContent 51 | item.classList.remove('panel-name') 52 | item.removeChild(item.children[0]) 53 | return name 54 | } 55 | 56 | const nameDiv = item.querySelector('.panel-name') 57 | if (!nameDiv) return name 58 | 59 | // In remarkjs the .panel-name span might be in a paragraph tag 60 | // and if the

is empty, we'll remove it 61 | if ( 62 | nameDiv.tagName === 'SPAN' && 63 | nameDiv.parentNode.tagName === 'P' && 64 | nameDiv.textContent === nameDiv.parentNode.textContent 65 | ) { 66 | name = nameDiv.textContent 67 | item.removeChild(nameDiv.parentNode) 68 | return name 69 | } 70 | 71 | // If none of the above, remove the nameDiv and return the name 72 | name = nameDiv.textContent 73 | nameDiv.parentNode.removeChild(nameDiv) 74 | return name 75 | } 76 | 77 | const processPanelItem = (item) => { 78 | const name = identifyPanelName(item) 79 | if (!name) { 80 | return null 81 | } 82 | return { name, content: item.children, id: uniquePanelId(name) } 83 | } 84 | 85 | const getCurrentPanelFromUrl = (panelset) => { 86 | const params = new URLSearchParams(window.location.search) 87 | return params.get(panelset) 88 | } 89 | 90 | const reflowPanelSet = (panels, idx) => { 91 | const res = document.createElement('div') 92 | res.className = 'panelset' 93 | res.id = 'panelset' + (idx > 0 ? idx : '') 94 | const panelSelected = getCurrentPanelFromUrl(res.id) 95 | 96 | // create header row 97 | const headerRow = document.createElement('ul') 98 | headerRow.className = 'panel-tabs' 99 | headerRow.setAttribute('role', 'tablist') 100 | panels 101 | .map((p, idx) => { 102 | const panelHeaderItem = document.createElement('li') 103 | panelHeaderItem.className = 'panel-tab' 104 | panelHeaderItem.setAttribute('role', 'tab') 105 | const thisPanelIsActive = panelSelected ? panelSelected === p.id : idx === 0 106 | if (thisPanelIsActive) { 107 | panelHeaderItem.classList.add('panel-tab-active') 108 | panelHeaderItem.setAttribute('aria-selected', true) 109 | } 110 | panelHeaderItem.tabIndex = 0 111 | panelHeaderItem.id = res.id + '_' + p.id // #panelsetid_panelid 112 | 113 | const panelHeaderLink = document.createElement('a') 114 | panelHeaderLink.href = '?' + res.id + '=' + p.id + '#' + panelHeaderItem.id 115 | panelHeaderLink.setAttribute('onclick', 'return false;') 116 | panelHeaderLink.tabIndex = -1 // list item is tabable, not link 117 | panelHeaderLink.innerHTML = p.name 118 | panelHeaderLink.setAttribute('aria-controls', p.id) 119 | 120 | panelHeaderItem.appendChild(panelHeaderLink) 121 | return panelHeaderItem 122 | }) 123 | .forEach(el => headerRow.appendChild(el)) 124 | 125 | res.appendChild(headerRow) 126 | 127 | panels 128 | .map((p, idx) => { 129 | const panelContent = document.createElement('section') 130 | panelContent.className = 'panel' 131 | panelContent.setAttribute('role', 'tabpanel') 132 | const thisPanelIsActive = panelSelected ? panelSelected === p.id : idx === 0 133 | panelContent.classList.toggle('panel-active', thisPanelIsActive) 134 | panelContent.id = p.id 135 | panelContent.setAttribute('aria-labelledby', p.id) 136 | Array.from(p.content).forEach(el => panelContent.appendChild(el)) 137 | return panelContent 138 | }) 139 | .forEach(el => res.appendChild(el)) 140 | 141 | return res 142 | } 143 | 144 | /* 145 | * Update selected panel for panelset or delete panelset from query string 146 | * 147 | * @param panelset Panelset ID to update in the search params 148 | * @param panel Panel ID of selected panel in panelset, or null to delete from search params 149 | * @param params Current params object, or params from window.location.search 150 | */ 151 | function updateSearchParams (panelset, panel, params = new URLSearchParams(window.location.search)) { 152 | if (panel) { 153 | params.set(panelset, panel) 154 | } else { 155 | params.delete(panelset) 156 | } 157 | return params 158 | } 159 | 160 | /* 161 | * Update the URL to match params 162 | */ 163 | const updateUrl = (params) => { 164 | if (typeof params === 'undefined') return 165 | params = params.toString() ? ('?' + params.toString()) : '' 166 | const { pathname, hash } = window.location 167 | const uri = pathname + params + hash 168 | window.history.replaceState(uri, '', uri) 169 | } 170 | 171 | const togglePanel = (clicked) => { 172 | if (clicked.nodeName.toUpperCase() === 'A') { 173 | clicked = clicked.parentElement 174 | } 175 | if (!clicked.classList.contains('panel-tab')) return 176 | if (clicked.classList.contains('panel-tab-active')) return 177 | 178 | const tabs = clicked.parentNode 179 | .querySelectorAll('.panel-tab') 180 | const panels = clicked.parentNode.parentNode 181 | .querySelectorAll('.panel') 182 | const panelTabClicked = clicked.children[0].getAttribute('aria-controls') 183 | const panelClicked = clicked.parentNode.parentNode.id 184 | 185 | Array.from(tabs) 186 | .forEach(t => { 187 | t.classList.remove('panel-tab-active') 188 | t.removeAttribute('aria-selected') 189 | }) 190 | Array.from(panels) 191 | .forEach(p => { 192 | const active = p.id === panelTabClicked 193 | p.classList.toggle('panel-active', active) 194 | // make inactive panels inaccessible by keyboard navigation 195 | if (active) { 196 | p.removeAttribute('tabIndex') 197 | p.removeAttribute('aria-hidden') 198 | } else { 199 | p.setAttribute('tabIndex', -1) 200 | p.setAttribute('aria-hidden', true) 201 | } 202 | }) 203 | 204 | clicked.classList.add('panel-tab-active') 205 | clicked.setAttribute('aria-selected', true) 206 | 207 | // update query string 208 | const params = updateSearchParams(panelClicked, panelTabClicked) 209 | updateUrl(params) 210 | } 211 | 212 | const initPanelSet = (panelset, idx) => { 213 | let panels = Array.from(panelset.querySelectorAll('.panel')) 214 | if (!panels.length && panelset.matches('.section[class*="level"]')) { 215 | // we're in tabset-alike R Markdown 216 | const panelsetLevel = [...panelset.classList] 217 | .filter(s => s.match(/^level/))[0] 218 | .replace('level', '') 219 | 220 | // move children that aren't inside a section up above the panelset 221 | Array.from(panelset.children).forEach(function (el) { 222 | if (el.matches('div.section[class*="level"]')) return 223 | panelset.parentElement.insertBefore(el, panelset) 224 | }) 225 | 226 | // panels are all .sections with .level 227 | const panelLevel = +panelsetLevel + 1 228 | panels = Array.from(panelset.querySelectorAll(`.section.level${panelLevel}`)) 229 | } 230 | 231 | if (!panels.length) return 232 | 233 | const contents = panels.map(processPanelItem).filter(o => o !== null) 234 | const newPanelSet = reflowPanelSet(contents, idx) 235 | panelset.parentNode.insertBefore(newPanelSet, panelset) 236 | panelset.parentNode.removeChild(panelset) 237 | 238 | // click and touch events 239 | const panelTabs = newPanelSet.querySelector('.panel-tabs'); 240 | ['click', 'touchend'].forEach(eventType => { 241 | panelTabs.addEventListener(eventType, function (ev) { 242 | togglePanel(ev.target) 243 | ev.stopPropagation() 244 | }) 245 | }) 246 | panelTabs.addEventListener('touchmove', function (ev) { 247 | ev.preventDefault() 248 | }) 249 | 250 | // key events 251 | newPanelSet 252 | .querySelector('.panel-tabs') 253 | .addEventListener('keydown', (ev) => { 254 | const self = ev.currentTarget.querySelector('.panel-tab-active') 255 | if (ev.code === 'Space' || ev.code === 'Enter') { 256 | togglePanel(ev.target) 257 | ev.stopPropagation() 258 | } else if (ev.code === 'ArrowLeft' && self.previousSibling) { 259 | togglePanel(self.previousSibling) 260 | self.previousSibling.focus() 261 | ev.stopPropagation() 262 | } else if (ev.code === 'ArrowRight' && self.nextSibling) { 263 | togglePanel(self.nextSibling) 264 | self.nextSibling.focus() 265 | ev.stopPropagation() 266 | } 267 | }) 268 | 269 | return panels 270 | } 271 | 272 | // initialize panels 273 | Array.from(document.querySelectorAll('.panelset')).map(initPanelSet) 274 | 275 | if (typeof slideshow !== 'undefined') { 276 | const getVisibleActivePanelInfo = () => { 277 | const slidePanels = document.querySelectorAll('.remark-visible .panel-tab-active') 278 | 279 | if (!slidePanels.length) return null 280 | 281 | return slidePanels.map(panel => { 282 | return { 283 | panel, 284 | panelId: panel.children[0].getAttribute('aria-controls'), 285 | panelSetId: panel.parentNode.parentNode.id 286 | } 287 | }) 288 | } 289 | 290 | slideshow.on('hideSlide', slide => { 291 | // clear focus if we had a panel-tab selected 292 | document.activeElement.blur() 293 | 294 | // clear search query for panelsets in current slide 295 | const params = [...document.querySelectorAll('.remark-visible .panelset')] 296 | .reduce(function (params, panelset) { 297 | return updateSearchParams(panelset.id, null, params) 298 | }, new URLSearchParams(window.location.search)) 299 | 300 | updateUrl(params) 301 | }) 302 | 303 | slideshow.on('afterShowSlide', slide => { 304 | const slidePanels = getVisibleActivePanelInfo() 305 | 306 | if (slidePanels) { 307 | // only first panel gets focus 308 | slidePanels[0].panel.focus() 309 | // but still update the url to reflect all active panels 310 | const params = slidePanels.reduce( 311 | function (params, { panelId, panelSetId }) { 312 | return updateSearchParams(panelSetId, panelId, params) 313 | }, 314 | new URLSearchParams(window.location.search) 315 | ) 316 | updateUrl(params) 317 | } 318 | }) 319 | } 320 | }) 321 | })() 322 | -------------------------------------------------------------------------------- /libs/remark-css/default.css: -------------------------------------------------------------------------------- 1 | a, a > code { 2 | color: rgb(249, 38, 114); 3 | text-decoration: none; 4 | } 5 | .footnote { 6 | position: absolute; 7 | bottom: 3em; 8 | padding-right: 4em; 9 | font-size: 90%; 10 | } 11 | .remark-code-line-highlighted { background-color: #ffff88; } 12 | 13 | .inverse { 14 | background-color: #272822; 15 | color: #d6d6d6; 16 | text-shadow: 0 0 20px #333; 17 | } 18 | .inverse h1, .inverse h2, .inverse h3 { 19 | color: #f3f3f3; 20 | } 21 | /* Two-column layout */ 22 | .left-column { 23 | color: #777; 24 | width: 20%; 25 | height: 92%; 26 | float: left; 27 | } 28 | .left-column h2:last-of-type, .left-column h3:last-child { 29 | color: #000; 30 | } 31 | .right-column { 32 | width: 75%; 33 | float: right; 34 | padding-top: 1em; 35 | } 36 | .pull-left { 37 | float: left; 38 | width: 47%; 39 | } 40 | .pull-right { 41 | float: right; 42 | width: 47%; 43 | } 44 | .pull-right ~ * { 45 | clear: both; 46 | } 47 | img, video, iframe { 48 | max-width: 100%; 49 | } 50 | blockquote { 51 | border-left: solid 5px lightgray; 52 | padding-left: 1em; 53 | } 54 | .remark-slide table { 55 | margin: auto; 56 | border-top: 1px solid #666; 57 | border-bottom: 1px solid #666; 58 | } 59 | .remark-slide table thead th { border-bottom: 1px solid #ddd; } 60 | th, td { padding: 5px; } 61 | .remark-slide thead, .remark-slide tfoot, .remark-slide tr:nth-child(even) { background: #eee } 62 | 63 | @page { margin: 0; } 64 | @media print { 65 | .remark-slide-scaler { 66 | width: 100% !important; 67 | height: 100% !important; 68 | transform: scale(1) !important; 69 | top: 0 !important; 70 | left: 0 !important; 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /libs/rstudio_leaflet/images/1px.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spcanelon/tour-of-the-tidyverse/fbd2afc7156e55cc08753c60086e99ff729ec20b/libs/rstudio_leaflet/images/1px.png -------------------------------------------------------------------------------- /libs/rstudio_leaflet/rstudio_leaflet.css: -------------------------------------------------------------------------------- 1 | .leaflet-tooltip.leaflet-tooltip-text-only, 2 | .leaflet-tooltip.leaflet-tooltip-text-only:before, 3 | .leaflet-tooltip.leaflet-tooltip-text-only:after { 4 | background: none; 5 | border: none; 6 | box-shadow: none; 7 | } 8 | 9 | .leaflet-tooltip.leaflet-tooltip-text-only.leaflet-tooltip-left { 10 | margin-left: 5px; 11 | } 12 | 13 | .leaflet-tooltip.leaflet-tooltip-text-only.leaflet-tooltip-right { 14 | margin-left: -5px; 15 | } 16 | 17 | .leaflet-tooltip:after { 18 | border-right: 6px solid transparent; 19 | /* right: -16px; */ 20 | } 21 | 22 | .leaflet-popup-pane .leaflet-popup-tip-container { 23 | /* when the tooltip container is clicked, it is closed */ 24 | pointer-events: all; 25 | /* tooltips should display the "hand" icon, just like .leaflet-interactive*/ 26 | cursor: pointer; 27 | } 28 | 29 | /* have the widget be displayed in the right 'layer' */ 30 | .leaflet-map-pane { 31 | z-index: auto; 32 | } 33 | -------------------------------------------------------------------------------- /libs/shareon/shareon.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * shareon v1.4.1 by Nikita Karamov 3 | * https://shareon.js.org 4 | */ 5 | .shareon{font-size:0!important}.shareon>*{display:inline-block;position:relative;height:24px;min-width:16px;margin:3px;padding:6px 10px;background-color:#ccc;border-radius:3.33333px;border:none;box-sizing:content-box;color:#fff;line-height:1.5;transition:opacity .3s ease;vertical-align:middle}.shareon>:hover{border:none;cursor:pointer;opacity:.7}.shareon>:not(:empty){font-size:16px;text-decoration:none}.shareon>:not(:empty):before{position:relative;height:100%;width:28px;top:0;left:0;background-position:0 50%}.shareon>:before{display:inline-block;position:absolute;height:20px;width:20px;top:8px;left:8px;background-repeat:no-repeat;background-size:20px 20px;content:"";vertical-align:bottom}.shareon>.facebook{background-color:#1877f2}.shareon>.facebook:before{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg fill='%23fff' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M23.998 12c0-6.628-5.372-12-11.999-12C5.372 0 0 5.372 0 12c0 5.988 4.388 10.952 10.124 11.852v-8.384H7.078v-3.469h3.046V9.356c0-3.008 1.792-4.669 4.532-4.669 1.313 0 2.686.234 2.686.234v2.953H15.83c-1.49 0-1.955.925-1.955 1.874V12h3.328l-.532 3.469h-2.796v8.384c5.736-.9 10.124-5.864 10.124-11.853z'/%3E%3C/svg%3E")}.shareon>.linkedin{background-color:#2867b2}.shareon>.linkedin:before{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg fill='%23fff' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M23.722 23.72h-4.91v-7.692c0-1.834-.038-4.194-2.559-4.194-2.56 0-2.95 1.995-2.95 4.06v7.827H8.394V7.902h4.716v2.157h.063c.659-1.244 2.261-2.556 4.655-2.556 4.974 0 5.894 3.274 5.894 7.535zM.388 7.902h4.923v15.819H.388zM2.85 5.738A2.849 2.849 0 010 2.886a2.851 2.851 0 112.85 2.852z'/%3E%3C/svg%3E")}.shareon>.linkedin:not(:empty):before{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg fill='%23fff' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 01-2.063-2.065 2.064 2.064 0 112.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z'/%3E%3C/svg%3E")}.shareon>.messenger{background-color:#09f}.shareon>.messenger:before{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg fill='%23fff' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 11.64C0 4.95 5.24 0 12 0s12 4.95 12 11.64-5.24 11.64-12 11.64c-1.21 0-2.38-.16-3.47-.46a.96.96 0 00-.64.05L5.5 23.92a.96.96 0 01-1.35-.85l-.07-2.14a.97.97 0 00-.32-.68A11.39 11.39 0 010 11.64zm8.32-2.19l-3.52 5.6c-.35.53.32 1.14.82.75l3.79-2.87c.26-.2.6-.2.87 0l2.8 2.1c.84.63 2.04.4 2.6-.48l3.52-5.6c.35-.53-.32-1.13-.82-.75l-3.79 2.87c-.25.2-.6.2-.86 0l-2.8-2.1a1.8 1.8 0 00-2.61.48z'/%3E%3C/svg%3E")}.shareon>.odnoklassniki{background-color:#ee8208}.shareon>.odnoklassniki:before{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg fill='%23fff' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.505 17.44a11.599 11.599 0 003.6-1.49 1.816 1.816 0 00-1.935-3.073 7.866 7.866 0 01-8.34 0 1.814 1.814 0 00-2.5.565c0 .002 0 .004-.002.005a1.812 1.812 0 00.567 2.5l.002.002c1.105.695 2.322 1.2 3.596 1.488l-3.465 3.465A1.796 1.796 0 006 23.439l.03.03c.344.354.81.53 1.274.53.465 0 .93-.176 1.275-.53L12 20.065l3.404 3.406a1.815 1.815 0 002.566-2.565l-3.465-3.466zM12 12.388a6.202 6.202 0 006.195-6.193C18.195 2.78 15.415 0 12 0S5.805 2.78 5.805 6.197A6.2 6.2 0 0012 12.389zm0-8.757a2.566 2.566 0 010 5.13 2.569 2.569 0 01-2.565-2.564A2.57 2.57 0 0112 3.63z'/%3E%3C/svg%3E")}.shareon>.pinterest{background-color:#ee0023}.shareon>.pinterest:before{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg fill='%23fff' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.017 0C5.396 0 .029 5.367.029 11.987c0 5.079 3.158 9.417 7.618 11.162-.105-.949-.199-2.403.041-3.439.219-.937 1.406-5.957 1.406-5.957s-.359-.72-.359-1.781c0-1.663.967-2.911 2.168-2.911 1.024 0 1.518.769 1.518 1.688 0 1.029-.653 2.567-.992 3.992-.285 1.193.6 2.165 1.775 2.165 2.128 0 3.768-2.245 3.768-5.487 0-2.861-2.063-4.869-5.008-4.869-3.41 0-5.409 2.562-5.409 5.199 0 1.033.394 2.143.889 2.741.099.12.112.225.085.345-.09.375-.293 1.199-.334 1.363-.053.225-.172.271-.401.165-1.495-.69-2.433-2.878-2.433-4.646 0-3.776 2.748-7.252 7.92-7.252 4.158 0 7.392 2.967 7.392 6.923 0 4.135-2.607 7.462-6.233 7.462-1.214 0-2.354-.629-2.758-1.379l-.749 2.848c-.269 1.045-1.004 2.352-1.498 3.146 1.123.345 2.306.535 3.55.535 6.607 0 11.985-5.365 11.985-11.987C23.97 5.39 18.592.026 11.985.026z'/%3E%3C/svg%3E")}.shareon>.pocket{background-color:#ef4154}.shareon>.pocket:before{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg fill='%23fff' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M18.813 10.259l-5.646 5.419a1.649 1.649 0 01-2.282 0l-5.646-5.419a1.645 1.645 0 012.276-2.376l4.511 4.322 4.517-4.322a1.643 1.643 0 012.326.049 1.64 1.64 0 01-.045 2.326zm5.083-7.546a2.163 2.163 0 00-2.041-1.436H2.179c-.9 0-1.717.564-2.037 1.405-.094.25-.142.511-.142.774v7.245l.084 1.441c.348 3.277 2.047 6.142 4.682 8.139.045.036.094.07.143.105l.03.023a11.899 11.899 0 004.694 2.072c.786.158 1.591.24 2.389.24.739 0 1.481-.067 2.209-.204.088-.029.176-.045.264-.06.023 0 .049-.015.074-.029a12.002 12.002 0 004.508-2.025l.029-.031.135-.105c2.627-1.995 4.324-4.862 4.686-8.148L24 10.678V3.445c0-.251-.031-.5-.121-.742z'/%3E%3C/svg%3E")}.shareon>.reddit{background-color:#ff4500}.shareon>.reddit:before{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg fill='%23fff' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M19.53 1.148a1.83 1.83 0 00-1.667 1.054l-4.372-.928a.522.522 0 00-.358.063.515.515 0 00-.21.297L11.59 7.925c-2.807.086-5.32.909-7.137 2.237a2.668 2.668 0 00-1.815-.737A2.64 2.64 0 000 12.064a2.634 2.634 0 001.563 2.407 4.95 4.95 0 00-.065.803c0 4.053 4.71 7.326 10.537 7.326s10.537-3.273 10.537-7.326a4.548 4.548 0 00-.063-.782 2.732 2.732 0 001.519-2.428 2.64 2.64 0 00-2.639-2.64 2.53 2.53 0 00-1.816.74c-1.796-1.288-4.287-2.134-7.031-2.239l1.204-5.637 3.906.823a1.888 1.888 0 001.878 1.777c1.024 0 1.87-.837 1.88-1.861a1.884 1.884 0 00-1.88-1.88zM7.907 18.066c-.13 0-.254.05-.347.141a.498.498 0 000 .697c1.266 1.267 3.736 1.373 4.454 1.373s3.167-.084 4.454-1.373a.546.546 0 00.044-.697.5.5 0 00-.698 0c-.823.802-2.533 1.099-3.779 1.099s-2.977-.295-3.779-1.099a.49.49 0 00-.349-.142zm-1.932-4.122c0-1.035.844-1.88 1.88-1.88 1.034 0 1.878.843 1.878 1.879S8.89 15.82 7.856 15.82a1.882 1.882 0 01-1.88-1.877zm10.155-1.88c1.035 0 1.88.845 1.88 1.879 0 1.035-.844 1.878-1.879 1.878s-1.879-.843-1.879-1.877c0-1.037.844-1.88 1.878-1.88z' fill-rule='evenodd'/%3E%3C/svg%3E")}.shareon>.telegram{background-color:#179cde}.shareon>.telegram:before{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg fill='%23fff' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M1.517 11.31c-.962.382-1.466.756-1.512 1.122-.088.702.924.921 2.196 1.335 1.037.337 2.433.731 3.158.747.658.014 1.393-.257 2.204-.814 5.533-3.735 8.39-5.622 8.57-5.663.126-.029.301-.065.42.04.119.106.107.306.095.36-.101.429-5.3 5.156-5.599 5.467-1.143 1.187-2.443 1.913-.437 3.235 1.735 1.144 2.746 1.873 4.534 3.045 1.142.75 2.039 1.637 3.218 1.529.543-.05 1.104-.56 1.389-2.083.673-3.598 1.996-11.392 2.302-14.604a3.585 3.585 0 00-.034-.8c-.027-.158-.084-.383-.29-.55-.243-.197-.619-.24-.787-.236-.764.013-1.936.42-7.579 2.767C11.39 7.03 7.44 8.73 1.517 11.31z'/%3E%3C/svg%3E")}.shareon>.twitter{background-color:#1da1f2}.shareon>.twitter:before{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg fill='%23fff' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M23.954 4.569a10 10 0 01-2.825.775 4.958 4.958 0 002.163-2.723c-.951.555-2.005.959-3.127 1.184a4.92 4.92 0 00-8.384 4.482C7.691 8.094 4.066 6.13 1.64 3.161a4.822 4.822 0 00-.666 2.475c0 1.71.87 3.213 2.188 4.096a4.904 4.904 0 01-2.228-.616v.061a4.923 4.923 0 003.946 4.827 4.996 4.996 0 01-2.212.085 4.937 4.937 0 004.604 3.417 9.868 9.868 0 01-6.102 2.105c-.39 0-.779-.023-1.17-.067a13.995 13.995 0 007.557 2.209c9.054 0 13.999-7.496 13.999-13.986 0-.209 0-.42-.015-.63a9.936 9.936 0 002.46-2.548l-.047-.02z'/%3E%3C/svg%3E")}.shareon>.viber{background-color:#7360f2}.shareon>.viber:before{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg fill='%23fff' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11.398.002C9.473.028 5.331.344 3.014 2.467 1.294 4.177.693 6.698.623 9.82c-.06 3.11-.13 8.95 5.5 10.541v2.42s-.038.97.602 1.17c.79.25 1.24-.499 1.99-1.299l1.4-1.58c3.85.32 6.8-.419 7.14-.529.78-.25 5.181-.811 5.901-6.652.74-6.031-.36-9.831-2.34-11.551l-.01-.002c-.6-.55-3-2.3-8.37-2.32 0 0-.396-.025-1.038-.016zm.067 1.697c.545-.003.88.02.88.02 4.54.01 6.711 1.38 7.221 1.84 1.67 1.429 2.528 4.856 1.9 9.892-.6 4.88-4.17 5.19-4.83 5.4-.28.09-2.88.73-6.152.52 0 0-2.439 2.941-3.199 3.701-.12.13-.26.17-.35.15-.13-.03-.17-.19-.16-.41l.02-4.019c-4.771-1.32-4.491-6.302-4.441-8.902.06-2.6.55-4.732 2-6.172 1.957-1.77 5.475-2.01 7.11-2.02zm.36 2.6a.299.299 0 00-.3.299.3.3 0 00.3.3 5.631 5.631 0 014.03 1.59c1.09 1.06 1.621 2.48 1.641 4.34a.3.3 0 00.3.3v-.009a.3.3 0 00.3-.3 6.451 6.451 0 00-1.81-4.76c-1.19-1.16-2.692-1.76-4.462-1.76zm-3.954.69a.955.955 0 00-.615.12h-.012c-.41.24-.788.54-1.148.94-.27.32-.421.639-.461.949a1.24 1.24 0 00.05.541l.02.01a13.722 13.722 0 001.2 2.6 15.383 15.383 0 002.32 3.171l.03.04.04.03.03.03.03.03a15.603 15.603 0 003.18 2.33c1.32.72 2.122 1.06 2.602 1.2v.01c.14.04.268.06.398.06a1.84 1.84 0 001.102-.472c.39-.35.7-.738.93-1.148v-.01c.23-.43.15-.841-.18-1.121a13.632 13.632 0 00-2.15-1.54c-.51-.28-1.03-.11-1.24.17l-.45.569c-.23.28-.65.24-.65.24l-.012.01c-3.12-.8-3.95-3.959-3.95-3.959s-.04-.43.25-.65l.56-.45c.27-.22.46-.74.17-1.25a13.522 13.522 0 00-1.54-2.15.843.843 0 00-.504-.3zm4.473.89a.3.3 0 00.002.6 3.78 3.78 0 012.65 1.15 3.5 3.5 0 01.9 2.57.3.3 0 00.3.299l.01.012a.3.3 0 00.3-.301c.03-1.19-.34-2.19-1.07-2.99-.73-.8-1.75-1.25-3.05-1.34a.3.3 0 00-.042 0zm.49 1.619a.305.305 0 00-.018.611c.99.05 1.47.55 1.53 1.58a.3.3 0 00.3.29h.01a.3.3 0 00.29-.32c-.07-1.34-.8-2.091-2.1-2.161a.305.305 0 00-.012 0z'/%3E%3C/svg%3E")}.shareon>.vkontakte{background-color:#4680c2}.shareon>.vkontakte:before{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg fill='%23fff' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M23.058 19.504h-2.616c-.99 0-1.297-.787-3.076-2.59-1.55-1.501-2.236-1.704-2.617-1.704-.534 0-.687.153-.687.89v2.363c0 .636-.202 1.017-1.88 1.017-2.77 0-5.845-1.677-8.004-4.804C.925 10.103.034 6.672.034 5.961c0-.381.153-.737.89-.737H3.54c.66 0 .915.305 1.17 1.016 1.295 3.736 3.456 7.014 4.345 7.014.33 0 .483-.153.483-.99V8.399c-.102-1.78-1.042-1.931-1.042-2.566 0-.306.255-.61.66-.61h4.117c.56 0 .762.304.762.964v5.211c0 .558.255.762.407.762.33 0 .61-.204 1.22-.813 1.88-2.11 3.227-5.362 3.227-5.362.178-.381.483-.737 1.145-.737h2.616c.788 0 .966.405.788.965-.33 1.526-3.532 6.048-3.532 6.048-.28.457-.381.66 0 1.17.28.381 1.194 1.169 1.805 1.88 1.118 1.27 1.98 2.338 2.21 3.076.255.735-.128 1.116-.864 1.116z'/%3E%3C/svg%3E")}.shareon>.whatsapp{background-color:#25d366}.shareon>.whatsapp:before{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg fill='%23fff' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51a12.8 12.8 0 00-.57-.01c-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413z'/%3E%3C/svg%3E")} -------------------------------------------------------------------------------- /libs/shareon/shareon.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * shareon v1.4.1 by Nikita Karamov 3 | * https://shareon.js.org 4 | */ 5 | 6 | var shareon=function(){"use strict";var t={facebook:t=>"https://www.facebook.com/sharer/sharer.php?u="+t.url,linkedin:t=>`https://www.linkedin.com/shareArticle?mini=true&url=${t.url}&title=${t.title}`,messenger:t=>`https://www.facebook.com/dialog/send?app_id=3619024578167617&link=${t.url}&redirect_uri=${t.url}`,odnoklassniki:t=>`https://connect.ok.ru/offer?url=${t.url}&title=${t.title}${t.media?"&imageUrl="+t.media:""}`,pinterest:t=>`https://pinterest.com/pin/create/button/?url=${t.url}&description=${t.title}${t.media?"&media="+t.media:""}`,pocket:t=>"https://getpocket.com/edit.php?url="+t.url,reddit:t=>`https://www.reddit.com/submit?title=${t.title}&url=${t.url}`,telegram:t=>`https://telegram.me/share/url?url=${t.url}${t.text?"&text="+t.text:""}`,twitter:t=>`https://twitter.com/intent/tweet?url=${t.url}&text=${t.title}${t.via?"&via="+t.via:""}`,viber:t=>`viber://forward?text=${t.title}%0D%0A${t.url}${t.text?"%0D%0A%0D%0A"+t.text:""}`,vkontakte:t=>`https://vk.com/share.php?url=${t.url}&title=${t.title}${t.media?"&image="+t.media:""}`,whatsapp:t=>`whatsapp://send?text=${t.title}%0D%0A${t.url}${t.text?"%0D%0A%0D%0A"+t.text:""}`};const e=()=>{const e=document.getElementsByClassName("shareon");for(let r=0;r{window.open(o,"_blank","noopener,noreferrer").opener=null});break}}}}}};return window.onload=()=>{e()},e}(); 7 | -------------------------------------------------------------------------------- /libs/tile-view/tile-view.css: -------------------------------------------------------------------------------- 1 | .remark__tile-view * { 2 | box-sizing: border-box; 3 | } 4 | 5 | .remark__tile-view { 6 | background: lightgray; 7 | position: relative; 8 | width: 100%; 9 | height: 100%; 10 | padding: 3em; 11 | font-size: 18px; 12 | box-sizing: border-box; 13 | overflow: scroll; 14 | } 15 | 16 | .remark__tile-view__header { 17 | text-align: center; 18 | } 19 | 20 | .remark__tile-view__tiles { 21 | display: grid; 22 | /* Set column width in JS */ 23 | /* grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); */ 24 | justify-items: center; 25 | } 26 | 27 | .remark__tile-view__tile { 28 | position: relative; 29 | margin: 0.5em; 30 | padding: 0.5em; 31 | } 32 | 33 | .remark__tile-view__slide-container { 34 | margin: 0 auto; 35 | } 36 | 37 | .remark__tile-view__tile--current { 38 | background: #ffd863; 39 | border: 5px solid #ffd863; 40 | margin: calc(0.5em - 5px); 41 | border-radius: 0; 42 | } 43 | 44 | .remark__tile-view__tile--seen { 45 | opacity: 0.5; 46 | } 47 | 48 | .remark__tile-view__tile:hover { 49 | /* background: #993d70; */ 50 | background: #44bc96; 51 | opacity: 1; 52 | } 53 | -------------------------------------------------------------------------------- /libs/tile-view/tile-view.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Tile View for remark.js Slides 3 | * 4 | * Garrick Aden-Buie 5 | * 6 | * Inspired and converted to Vanilla JS from 7 | * https://github.com/StephenHesperus/remark-hook/ 8 | * 9 | * Include after remarkjs slides are initialized. 10 | * 11 | */ 12 | 13 | /* global slideshow */ 14 | (function () { 15 | const ready = function (fn) { 16 | /* MIT License Copyright (c) 2016 Nuclei */ 17 | /* https://github.com/nuclei/readyjs */ 18 | const completed = () => { 19 | document.removeEventListener('DOMContentLoaded', completed) 20 | window.removeEventListener('load', completed) 21 | fn() 22 | } 23 | if (document.readyState !== 'loading') { 24 | setTimeout(fn) 25 | } else { 26 | document.addEventListener('DOMContentLoaded', completed) 27 | window.addEventListener('load', completed) 28 | } 29 | } 30 | 31 | ready(function () { 32 | const launchKey = 79 // keycode for O, used to enable tile view 33 | 34 | // Slides container 35 | const remarkSlideShow = document.querySelector('div.remark-slides-area') 36 | 37 | let tileView = document.querySelector('div.remark__tile-view') 38 | if (!tileView) { 39 | tileView = document.createElement('div') 40 | tileView.className = 'remark__tile-view' 41 | } 42 | 43 | const toggleElement = el => { 44 | el.style.display = el.style.display === 'none' ? '' : 'none' 45 | } 46 | 47 | const toggleTileView = function () { 48 | toggleElement(tileView) 49 | toggleElement(remarkSlideShow) 50 | 51 | if (tileView.style.display === 'none') { 52 | // tileView is now hidden, go to current slide 53 | slideshow.gotoSlide(tileVars.currentSlideIdx + 1) 54 | 55 | // remove scroll/mousewheel event blocking 56 | tileView.removeEventListener('mousewheel', blockEvent) 57 | tileView.removeEventListener('DOMMouseScroll', blockEvent) 58 | console.log('removing blockScaling') 59 | document.removeEventListener('keydown', blockScaling) 60 | } else { 61 | // store current slide index prior to launching tile-view 62 | tileVars.currentSlideIdx = slideshow.getCurrentSlideIndex() 63 | 64 | // set class on seen and current slide and scroll into view 65 | const tiles = tileView.querySelectorAll('.remark__tile-view__tile'); 66 | [...tiles].forEach((tile, idx) => { 67 | tile.classList.toggle( 68 | 'remark__tile-view__tile--seen', 69 | idx < tileVars.currentSlideIdx 70 | ) 71 | tile.classList.toggle( 72 | 'remark__tile-view__tile--current', 73 | idx === tileVars.currentSlideIdx 74 | ) 75 | }) 76 | tiles[tileVars.currentSlideIdx].scrollIntoView({ 77 | behavior: 'smooth', 78 | block: 'center' 79 | }) 80 | 81 | // block remarkjs from handling scroll events 82 | tileView.addEventListener('mousewheel', blockEvent) 83 | tileView.addEventListener('DOMMouseScroll', blockEvent) 84 | console.log('adding blockScaling') 85 | document.addEventListener('keydown', blockScaling) 86 | } 87 | } 88 | 89 | const createTileView = ({ minSize = 250, title = document.title } = {}) => { 90 | // Tile view header 91 | const h1 = document.createElement('h1') 92 | h1.className = 'remark__tile-view__header' 93 | h1.innerHTML = title 94 | 95 | tileView.appendChild(h1) 96 | const tiles = document.createElement('div') 97 | tiles.className = 'remark__tile-view__tiles' 98 | tileView.appendChild(tiles) 99 | 100 | // Clone slideshow 101 | const slidesArea = remarkSlideShow.cloneNode(true) 102 | 103 | // Calculate slide scale and tile container size 104 | const slideScaler = slidesArea.querySelector('.remark-slide-scaler') 105 | const slideWidth = parseFloat(slideScaler.style.width.replace('px', '')) 106 | const slideHeight = parseFloat( 107 | slideScaler.style.height.replace('px', '') 108 | ) 109 | const scale = minSize / Math.min(slideWidth, slideHeight) 110 | let tileWidth = Math.round(slideWidth * scale) 111 | let tileHeight = Math.round(slideHeight * scale) 112 | 113 | // convert tileWidth/Height to em relative to base 18px (set in CSS) 114 | tileWidth = tileWidth / 18 115 | tileHeight = tileHeight / 18 116 | 117 | tiles.style.gridTemplateColumns = `repeat(auto-fill, minmax(${tileWidth}em, 1fr))` 118 | 119 | const slides = slidesArea.querySelectorAll('.remark-slide-container') 120 | 121 | slides.forEach((slide, slideIndex) => { 122 | let tile = document.createElement('template') 123 | tile.innerHTML = `

124 |
125 |
` 126 | tile = tile.content.firstChild 127 | 128 | const tileContainer = tile.querySelector( 129 | '.remark__tile-view__slide-container' 130 | ) 131 | tileContainer.style.width = `${tileWidth}em` 132 | tileContainer.style.height = `${tileHeight}em` 133 | 134 | const thisSlideScaler = slide.querySelector('.remark-slide-scaler') 135 | thisSlideScaler.style.top = '0px' 136 | thisSlideScaler.style.left = '0px' 137 | thisSlideScaler.style.transform = `scale(${scale})` 138 | thisSlideScaler.parentElement.classList.add('remark-visible') 139 | 140 | slide.addEventListener('click', () => { 141 | tileVars.currentSlideIdx = slideIndex 142 | toggleTileView() 143 | }) 144 | 145 | tileContainer.appendChild(slide) 146 | tiles.appendChild(tile) 147 | }) 148 | 149 | document.body.appendChild(tileView) 150 | } 151 | 152 | const tileVars = {} 153 | const blockEvent = ev => ev.stopPropagation() 154 | const blockScaling = function (ev) { 155 | if (ev.controlKey || ev.metaKey) { 156 | if (ev.key === '=' || ev.key === '-') { 157 | ev.preventDefault() 158 | console.log('window scaling is not allowed inside the tile overview') 159 | } 160 | } 161 | } 162 | 163 | document.addEventListener('keydown', ev => { 164 | if (ev.keyCode === launchKey) { 165 | toggleTileView() 166 | } 167 | }) 168 | 169 | const addTileViewHelpText = () => { 170 | const helpTable = document.querySelector( 171 | '.remark-help-content table.light-keys' 172 | ) 173 | if (!helpTable) { 174 | console.error( 175 | 'Could not find remark help table, has remark been initialized?' 176 | ) 177 | return 178 | } 179 | const newRow = document.createElement('tr') 180 | newRow.innerHTML += 'o' 181 | newRow.innerHTML += 'Tile View: Overview of Slides' 182 | helpTable.append(newRow) 183 | } 184 | 185 | createTileView({ minSize: 200 }) 186 | toggleElement(tileView) 187 | addTileViewHelpText() 188 | }) 189 | })() 190 | -------------------------------------------------------------------------------- /libs/xaringanExtra-clipboard/xaringanExtra-clipboard.css: -------------------------------------------------------------------------------- 1 | .xaringanextra-clipboard-button { 2 | position: absolute; 3 | top: 0; 4 | right: 0; 5 | font-size: 0.8em; 6 | padding: 0.5em; 7 | display: none; 8 | background-color: transparent; 9 | border: none; 10 | opacity: 0.5; 11 | border-radius: 0; 12 | } 13 | 14 | .xaringanextra-clipboard-button:hover { 15 | background-color: rgba(0, 0, 0, 0.1); 16 | border: none; 17 | opacity: 1; 18 | } 19 | 20 | :hover > .xaringanextra-clipboard-button { 21 | display: block; 22 | transform: translateY(0); 23 | } 24 | -------------------------------------------------------------------------------- /libs/xaringanExtra-clipboard/xaringanExtra-clipboard.js: -------------------------------------------------------------------------------- 1 | /* global slideshow,window,document */ 2 | window.xaringanExtraClipboard = function (selector, text) { 3 | if (!window.ClipboardJS.isSupported()) return 4 | if (!window.xaringanExtraClipboards) window.xaringanExtraClipboards = {} 5 | 6 | const ready = function (fn) { 7 | /* MIT License Copyright (c) 2016 Nuclei */ 8 | /* https://github.com/nuclei/readyjs */ 9 | const completed = () => { 10 | document.removeEventListener('DOMContentLoaded', completed) 11 | window.removeEventListener('load', completed) 12 | fn() 13 | } 14 | if (document.readyState !== 'loading') { 15 | setTimeout(fn) 16 | } else { 17 | document.addEventListener('DOMContentLoaded', completed) 18 | window.addEventListener('load', completed) 19 | } 20 | } 21 | 22 | ready(function () { 23 | const { 24 | button: buttonText = 'Copy Code', 25 | success: successText = 'Copied!', 26 | error: errorText = 'Press Ctrl+C to Copy' 27 | } = text 28 | 29 | const template = '` 31 | 32 | const isRemarkSlideshow = typeof slideshow !== 'undefined' && 33 | Object.prototype.hasOwnProperty.call(slideshow, 'getSlides') 34 | 35 | let siblingSelector = selector || 'pre' 36 | if (!selector && isRemarkSlideshow) { 37 | siblingSelector = '.remark-slides-area ' + siblingSelector 38 | } 39 | 40 | // insert 68 | 69 | 70 |
  • ${getShortTitle()}
  • 71 |
  • 72 | 73 | 74 |
    75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 |
    83 |
  • 84 | ` 85 | 86 | const slidesContainer = document.querySelector(':not(html).remark-container') 87 | slidesContainer.appendChild(navbar) 88 | 89 | const btnSlidePrev = document.getElementById('shareagain-slide-prev') 90 | const btnSlideNext = document.getElementById('shareagain-slide-next') 91 | 92 | function toggleSlideButtons (slideIndex) { 93 | if (typeof slideIndex === 'undefined') { 94 | slideIndex = slideshow.getCurrentSlideIndex() 95 | } 96 | 97 | // Toggle next slide button 98 | if (slideIndex + 1 === slideshow.getSlideCount()) { 99 | btnSlideNext.classList.add('disabled') 100 | btnSlideNext.setAttribute('disabled', true) 101 | } else { 102 | btnSlideNext.classList.remove('disabled') 103 | btnSlideNext.removeAttribute('disabled') 104 | } 105 | 106 | // Toggle prev slide button 107 | if (slideIndex === 0) { 108 | btnSlidePrev.classList.add('disabled') 109 | btnSlidePrev.setAttribute('disabled', true) 110 | } else { 111 | btnSlidePrev.classList.remove('disabled') 112 | btnSlidePrev.removeAttribute('disabled') 113 | } 114 | } 115 | 116 | setTimeout(toggleSlideButtons, 100) 117 | 118 | // button click events 119 | btnSlidePrev.addEventListener('click', function (ev) { 120 | slideshow.gotoPreviousSlide() 121 | }) 122 | 123 | btnSlideNext.addEventListener('click', function (ev) { 124 | slideshow.gotoNextSlide() 125 | }) 126 | 127 | // button touch events (block remarkjs slide change on touch) 128 | btnSlidePrev.addEventListener('touchend', function (ev) { 129 | slideshow.gotoPreviousSlide() 130 | ev.stopPropagation() 131 | }) 132 | 133 | btnSlideNext.addEventListener('touchend', function (ev) { 134 | slideshow.gotoNextSlide() 135 | ev.stopPropagation() 136 | }); 137 | 138 | // show/hide share buttons 139 | ['click', 'touchend'].map(function (evType) { 140 | document.getElementById('shareagain-share').addEventListener(evType, function (ev) { 141 | toggleShareButtons() 142 | ev.preventDefault() 143 | ev.stopPropagation() 144 | }) 145 | }) 146 | 147 | navbar.addEventListener('touchend', function (ev) { 148 | ev.preventDefault() 149 | ev.stopPropagation() 150 | }) 151 | 152 | // copy slides link to clipboard 153 | const shareClip = new ClipboardJS('.shareon .link') 154 | shareClip.on('success', function (e) { 155 | const el = document.querySelector('.shareon .link') 156 | el.classList.add('success') 157 | setTimeout(() => el.classList.remove('success'), 2500) 158 | }) 159 | 160 | slideshow.on('afterShowSlide', function (slide) { 161 | toggleSlideButtons(slide.getSlideIndex()) 162 | }) 163 | 164 | function toggleAnimated ({ selector, show, inClass, outClass }) { 165 | const el = document.querySelector(selector) 166 | const isShown = el.classList.contains(inClass) 167 | if (typeof show === 'undefined') { 168 | show = !isShown 169 | } 170 | if (show === isShown) { 171 | return 172 | } 173 | if (show) { 174 | el.classList.remove(outClass) 175 | el.classList.add(inClass) 176 | } else { 177 | el.classList.remove(inClass) 178 | el.classList.add(outClass) 179 | } 180 | } 181 | 182 | let isCurrentlyFullScreen = false 183 | document.addEventListener('fullscreenchange', (event) => { 184 | if (document.fullscreenElement) { 185 | stopAutoHide(false) 186 | isCurrentlyFullScreen = true 187 | } else { 188 | isCurrentlyFullScreen = false 189 | startAutoHide() 190 | } 191 | }) 192 | 193 | function toggleNavBar (show) { 194 | // do nothing if currently fullscreen 195 | if (isCurrentlyFullScreen) return 196 | 197 | toggleAnimated({ selector: '.shareagain-bar ul', show, inClass: 'slideInUp', outClass: 'slideOutDown' }) 198 | if (!show) toggleShareButtons(false) 199 | } 200 | 201 | function toggleShareButtons (show) { 202 | toggleAnimated({ selector: '.shareagain-bar .shareon', show, inClass: 'slideInRight', outClass: 'slideOutRight' }) 203 | } 204 | 205 | // auto hide the share bar when focus is in the slides 206 | let mouseMoveTimer = null 207 | function hideNavDelayed (ev) { 208 | if (mouseMoveTimer) { 209 | clearTimeout(mouseMoveTimer) 210 | } 211 | toggleNavBar(true) 212 | mouseMoveTimer = setTimeout(function () { toggleNavBar(false) }, 2000) 213 | }; 214 | 215 | // toggle toggle full screen 216 | ['click', 'touchend'].map(function (evType) { 217 | document.getElementById('shareagain-fullscreen').addEventListener(evType, function (ev) { 218 | slideshow.toggleFullscreen() 219 | ev.stopPropagation() 220 | }) 221 | }) 222 | 223 | function startAutoHide () { 224 | hideNavDelayed() 225 | slidesContainer.addEventListener('mousemove', hideNavDelayed) 226 | } 227 | 228 | function stopAutoHide (showAfter = false) { 229 | slidesContainer.removeEventListener('mousemove', hideNavDelayed) 230 | clearTimeout(mouseMoveTimer) 231 | toggleNavBar(showAfter) 232 | } 233 | 234 | // auto hide turns on when the mouse comes into the slides area 235 | slidesContainer.addEventListener('mouseenter', function () { 236 | startAutoHide() 237 | }) 238 | 239 | // turn off auto hide when the mouse leaves the slides area 240 | slidesContainer.addEventListener('mouseleave', function () { 241 | stopAutoHide(true) 242 | }); 243 | 244 | // turn off auto hide if the mouse or focus is in the share bar 245 | ['focusin', 'mouseenter'].map(function (evType) { 246 | navbar.addEventListener(evType, function () { 247 | stopAutoHide(true) 248 | }) 249 | }); 250 | 251 | // and turn auto hide back on whne the mouse leaves the share bar 252 | // (if mouse exits out of the slides area, the slidesContainer should fire later) 253 | ['focusout', 'mouseleave'].map(function (evType) { 254 | navbar.addEventListener(evType, function () { 255 | startAutoHide() 256 | }) 257 | }) 258 | } 259 | })() 260 | -------------------------------------------------------------------------------- /rladies-fonts-spc.css: -------------------------------------------------------------------------------- 1 | @import url(https://fonts.googleapis.com/css?family=Lato); 2 | @import url(https://fonts.googleapis.com/css?family=Yanone+Kaffeesatz); 3 | @import url('https://fonts.googleapis.com/css?family=Inconsolata:400,700'); 4 | 5 | @import url('https://fonts.googleapis.com/css?family=Lora:300,400,500'); 6 | @import url('https://fonts.googleapis.com/css?family=Fira+Sans+Extra+Condensed:300,400,500'); 7 | @import url('https://fonts.googleapis.com/css?family=Roboto+Mono:300,400,500'); 8 | 9 | body { 10 | font-family:'Fira Sans', sans-serif; 11 | font-weight: 400; 12 | color: #2E3440; 13 | 14 | } 15 | 16 | .remark-slide-content { 17 | font-size: 22px; 18 | padding: 1em 4em 1em 4em; 19 | } 20 | 21 | h1 { 22 | font-family: 'Lora', serif; 23 | font-weight: 500; 24 | color: #562457; 25 | } 26 | 27 | h2 { 28 | font-family: 'Fira Sans', sans-serif; 29 | font-weight: 400; 30 | color: #2E3440; 31 | } 32 | 33 | h3 { 34 | font-family: 'Fira Sans', sans-serif; 35 | /*text-transform: uppercase;*/ 36 | font-weight: 400; 37 | color: #2E3440; 38 | font-size: 1.3em !important; 39 | } 40 | 41 | h4, h5, h6 { 42 | font-family: 'Fira Sans', serif; 43 | font-weight: 350; 44 | color: #2E3440; 45 | } 46 | 47 | .remark-code, .remark-inline-code { 48 | font-family: 'Roboto Mono', monospace; 49 | color: #88398A} -------------------------------------------------------------------------------- /rladies-spc.css: -------------------------------------------------------------------------------- 1 | h1, h2, h3 { 2 | font-weight: normal; 3 | color: #562457; 4 | } 5 | a, a > code { 6 | color: #88398a; 7 | } 8 | 9 | .inverse { 10 | /*background-color: #2E3440;*/ 11 | background-color: #562457; 12 | text-shadow: none; 13 | } 14 | 15 | .inverse, .inverse h1, .inverse h2, .inverse h3, .inverse a, inverse a > code { 16 | color: #ECEFF4; 17 | } 18 | 19 | /* title slide */ 20 | .title-slide { 21 | background-color: #562457; 22 | } 23 | .title-slide h1 { 24 | color: #ECEFF4; 25 | } 26 | .title-slide h2, .title-slide h3 { 27 | color: #ECEFF4; 28 | line-height: 1em; 29 | } 30 | 31 | /* about me slide */ 32 | .about-me { 33 | background-image: url(https://images.unsplash.com/photo-1505168125601-4ddfdea4c7e7?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=2102&q=80); 34 | background-position: 52% 5%; 35 | background-size: cover; 36 | background-color: #181830; 37 | } 38 | .about-me h1 { 39 | color: #562457; 40 | opacity: 1; 41 | } 42 | .about-me h2, .about-me h3 { 43 | color: #562457; 44 | line-height: 1em; 45 | font-weight: 400; 46 | } 47 | .about-me a { 48 | color: #88398a; 49 | } 50 | 51 | /* penguin tour slide */ 52 | .penguin-tour { 53 | background-image: url(https://images.unsplash.com/photo-1591792111137-5b8219d5fad6?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=4350&q=80); 54 | background-position: 52% 5%; 55 | background-size: cover; 56 | background-color: #181830; 57 | } 58 | 59 | /* footnotes */ 60 | .footnote { 61 | position: absolute; 62 | bottom: 1em; 63 | right: 5px; 64 | padding-right: 1em; 65 | font-size: 80%; 66 | } 67 | 68 | .small-text { 69 | font-size: 80%; 70 | } 71 | 72 | /* 3-column split */ 73 | /* https://rstudio-education.github.io/teaching-in-production/ */ 74 | 75 | .flex { 76 | display: flex; 77 | justify-content: center; 78 | align-items: flex-start; 79 | } 80 | 81 | .column { 82 | float: left; 83 | width: 25%; 84 | text-align: center; 85 | } 86 | 87 | 88 | /*-------*/ 89 | .left-column { 90 | color: #2E3440; 91 | width: 20%; 92 | height: 92%; 93 | float: left; 94 | } 95 | 96 | .columns { 97 | display: flex; 98 | } 99 | 100 | .left-col { 101 | width: 33%; 102 | text-align: left; 103 | } 104 | 105 | .middle-col { 106 | width: 33%; 107 | text-align: left; 108 | padding-left: 20px; 109 | } 110 | 111 | .right-col { 112 | width: 33%; 113 | text-align: left; 114 | padding-left: 20px; 115 | } 116 | 117 | /* inline code highlighting */ 118 | /* https://github.com/yihui/xaringan/wiki/Inline-code-highlighting */ 119 | 120 | .remark-code-line-highlighted { 121 | /*background-color: rgba(136, 57, 138, 0.3); */ 122 | background-color: rgba(204, 189, 204, 0.6); 123 | } 124 | 125 | .remark-inline-code{ 126 | /* background: #F5F5F5; /* lighter */ 127 | background: rgba(204, 189, 204, 0.4); 128 | border-radius: 0px; 129 | padding: 0.5 0 0.5 0px; 130 | } 131 | 132 | /* code chunk background layer */ 133 | pre { 134 | /*border: 2px solid rgba(204, 189, 204, 0.8); /* code chunk border*/ 135 | border: none; 136 | box-shadow: 2px 2px 2px 2px #eee; 137 | padding: 0.1em; /* padding between code chunk and border */ 138 | background: none !important; 139 | overflow-x: auto; 140 | border-radius: 1px; /* modify rounding of corners*/ 141 | } 142 | pre code { 143 | background: none; 144 | font-size: 1.3rem !important; 145 | } 146 | -------------------------------------------------------------------------------- /tour-of-the-tidyverse.Rmd: -------------------------------------------------------------------------------- 1 | --- 2 | title: "An Antarctic Tour of the Tidyverse" 3 | subtitle: "R-Ladies Chicago" 4 | author: "Silvia Canelón, PhD" 5 | institute: "University of Pennsylvania, Philadelphia, PA, US" 6 | date: "August 31, 2020" 7 | output: 8 | xaringan::moon_reader: 9 | css: ["default", "rladies-spc.css", "rladies-fonts-spc.css"] 10 | #css: ["default", "rladies", "rladies-fonts"] 11 | lib_dir: libs 12 | seal: false 13 | nature: 14 | highlightStyle: github 15 | highlightLines: true 16 | highlightLanguage: ["r", "css", "yaml"] 17 | countIncrementalSlides: true 18 | ratio: "16:9" 19 | --- 20 | 21 | ```{r setup, include=FALSE} 22 | options(htmltools.dir.version = FALSE) 23 | knitr::opts_chunk$set(collapse = TRUE, 24 | fig.retina = 3, 25 | warning = FALSE, 26 | message = FALSE) 27 | 28 | library(tidyverse) 29 | library(palmerpenguins) 30 | library(nord) 31 | library(prismatic) 32 | library(xaringanExtra) 33 | xaringanExtra::use_xaringan_extra(include = c("panelset", "tile_view", "share_again")) 34 | xaringanExtra::use_clipboard() 35 | xaringanExtra::style_share_again(share_buttons = c("twitter", "linkedin", "pocket")) 36 | xaringanExtra::embed_xaringan( 37 | url = "https://spcanelon.github.io/2020-rladies-chi-tidyverse", ratio = "16:9") 38 | ``` 39 | 40 | 41 | class: title-slide, center, bottom 42 | 43 | ```{r title-slide, echo=FALSE, out.width=400} 44 | knitr::include_graphics("images/lter_penguins.png") 45 | ``` 46 | # `r rmarkdown::metadata$title` 47 | 48 | ## `r rmarkdown::metadata$subtitle` 49 | 50 | ### `r rmarkdown::metadata$author` 51 | 52 | ### `r rmarkdown::metadata$date` 53 | 54 | 55 | --- 56 | class: about-me, middle, center 57 | 58 | ## Silvia Canelón 59 | 60 | ### Postdoctoral Research Scientist 61 | 62 | ### University of Pennsylvania, Philadelphia, PA, USA 63 | 64 | 65 | 66 | 67 | [`r icon::fa("link")` silvia.rbind.io](https://silvia.rbind.io)
    68 | [`r icon::fa("twitter")` @spcanelon](https://twitter.com/spcanelon)
    69 | [`r icon::fa("github")` @spcanelon](https://github.com/spcanelon) 70 | 71 | .footnote[Photo by lucas huffman on Unsplash] 72 | 73 | --- 74 | class: left, middle 75 | 76 | # Acknowledgments 77 | 78 | ### [palmerpenguins](https://allisonhorst.github.io/palmerpenguins/articles/intro.html) `r emo::ji("package")` developed by Drs. [Allison Horst](https://www.allisonhorst.com/), [Alison Hill](https://alison.rbind.io/), and [Kristen Gorman](https://www.uaf.edu/cfos/people/faculty/detail/kristen-gorman.php). 79 | 80 | ### Penguin artwork by Allison Horst ([@allison_horst](https://twitter.com/allison_horst)) 81 | 82 | ### Slide inspiration from Alison Hill ([@apreshill](https://twitter.com/apreshill))'s recent education training materials "[Teaching in Production](https://rstudio-education.github.io/teaching-in-production/)" 83 | 84 | ### Slides made using Dr. Yihui Xie's [xaringan](https://github.com/yihui/xaringan) `r emo::ji("package")` and Garrick Aden-Buie's [xaringanExtra](https://github.com/gadenbuie/xaringanExtra) `r emo::ji("package")`, and adapted from the [R-Ladies `xaringan` theme designed by Alison Hill](https://alison.rbind.io/post/2017-12-18-r-ladies-presentation-ninja/) 85 | 86 | ### Photographs from various photographers on Unsplash, and noted on the relevant slide 87 | 88 | --- 89 | class: left, top 90 | background-image: url(images/logo.png) 91 | background-position: 1050px 50px 92 | background-size: 80px 93 | 94 | # Meet our penguin friends! 95 | 96 |
    97 |
    98 |

    Chinstrap

    99 | 100 |
    101 | 102 |
    103 |

    Gentoo

    104 | 105 |
    106 | 107 |
    108 |

    Adélie

    109 | 110 |
    111 |
    112 | 113 | .footnote[`r emo::ji("penguin")`Photos by Long Ma on Unsplash 114 | ] 115 | 116 | --- 117 | class: right, top 118 | background-image: url(images/pptx/tidyverse.png) 119 | background-size: 1150px 120 | 121 | ## Collection of R packages, including
    these 8 core packages (and more!) 122 | 123 | --- 124 | 125 | ```{r 01-readr, child="01-readr.Rmd"} 126 | ``` 127 | 128 | --- 129 | 130 | ```{r 02-tibble, child="02-tibble.Rmd"} 131 | ``` 132 | 133 | --- 134 | 135 | ```{r 03-ggplot2, child="03-ggplot2.Rmd"} 136 | ``` 137 | 138 | --- 139 | 140 | ```{r 04-dplyr, child="04-dplyr.Rmd"} 141 | ``` 142 | 143 | --- 144 | 145 | ```{r 05-forcats, child="05-forcats.Rmd"} 146 | ``` 147 | 148 | --- 149 | 150 | ```{r 06-stringr, child="06-stringr.Rmd"} 151 | ``` 152 | 153 | --- 154 | 155 | ```{r 07-tidyr, child="07-tidyr.Rmd"} 156 | ``` 157 | 158 | --- 159 | 160 | ```{r 08-purrr, child="08-purrr.Rmd"} 161 | ``` 162 | 163 | --- 164 | class: about-me, middle, center 165 | 166 | # Thank you! 167 | 168 | ## Any questions? 169 | 170 | -------------------------------------------------------------------------------- /tour-of-the-tidyverse.Rproj: -------------------------------------------------------------------------------- 1 | Version: 1.0 2 | 3 | RestoreWorkspace: Default 4 | SaveWorkspace: Default 5 | AlwaysSaveHistory: Default 6 | 7 | EnableCodeIndexing: Yes 8 | UseSpacesForTab: Yes 9 | NumSpacesForTab: 2 10 | Encoding: UTF-8 11 | 12 | RnwWeave: Sweave 13 | LaTeX: pdfLaTeX 14 | --------------------------------------------------------------------------------