class: center, middle, inverse, title-slide .title[ # ISA 401: Business Intelligence & Data Visualization ] .subtitle[ ## 02: Introduction to
] .author[ ###
Fadel M. Megahed, PhD
Professor of Information Systems and Business Analytics
Farmer School of Business
Miami University
@FadelMegahed
fmegahed
fmegahed@miamioh.edu
Automated Scheduler for Office Hours
] .date[ ### Fall 2024 ] --- ## Quick Refresher from Last Class ✅ Describe course objectives & structure ✅ Define data visualization & describe its main goals ✅ Describe the BI methodology and major concepts --- ## Quick Refresher from Last Class <img src="data:image/png;base64,#../../figures/midjourney_taylor_swift.png" width="45%" style="display: block; margin: auto;" /> .footnote[ <html> <hr> </html> **Note:** Image generated using [Midjourney AI](https://www.midjourney.com/) v6.1 on Aug 27, 2024. I used the **following prompt:** Taylor Swift holding a sign that says "3D Charts are Awful" with Cincinnati skyline in the background. ] --- ## Learning Objectives for Today's Class - Describe why we are using
in this course? - Understand the syntax, data structures and functions. - Utilize the project workflow in
and create your first
script. --- class: inverse, center, middle #
--- ## Pedagogy Behind Using
in this Course .font80[ ``` r crashes = # reading the data directly from the source readr::read_csv("https://data.cincinnati-oh.gov/api/views/rvmt-pkmq/rows.csv?accessType=DOWNLOAD") |> # changing all variable names to snake_case janitor::clean_names() |> # selecting variables of interest dplyr::select(address_x, latitude_x, longitude_x, cpd_neighborhood, datecrashreported, instanceid, typeofperson, weather) |> # engineering some features from the data dplyr::mutate( datetime = lubridate::parse_date_time(datecrashreported, orders = "'%m/%d/%Y %I:%M:%S %p", tz = 'America/New_York'), hour = lubridate::hour(datetime), date = lubridate::as_date(datetime) ) ``` ] ### The Beauty of Programming Languages - Programming languages are **languages**. - **It's just text** -- which gives you access to **two extremely powerful techniques**!!! .footnote[ <html> <hr> </html> **Source:** Content in "The Beauty of Programming Languages" is from [Hadley Wickham's You Can't Do Data Science in a GUI](https://speakerdeck.com/hadley/you-cant-do-data-science-in-a-gui?slide=14) ] --- ## Pedagogy Behind Using
in this Course ### The Beauty of Programming Languages (Continued) - .large[`Ctrl` + `C`
] - .large[`Ctrl` + `V`]
- In addition, programming languages are generally + Readable (IMO way easier than trying to figure what someone did in an
) + Open (so you can
it) + Reusable and reproducible (so you can reuse your code for similar problems and other people can get the same results as you easily) + Diffable (version control is extremely powerful) .footnote[ <html> <hr> </html> **Source:** The bullets in "The Beauty of Programming Languages" are based on [Hadley Wickham's You Can't Do Data Science in a GUI](https://speakerdeck.com/hadley/you-cant-do-data-science-in-a-gui?slide=17) ] --- ## Pedagogy Behind Using
in this Course ### Why
Specifically? - It is a general-purpose programming language, which originated for statistical analysis. - As of Aug 28, 2024, there are 20,332 packages on [CRAN](https://cran.r-project.org/) (not including those on
). - The `tidyverse` group of packages have simplified the workflow for data analytics/science. --- ## How to Learn
(Any Programming Language) <html> <center> <iframe src="https://giphy.com/embed/xonOzxf2M8hNu" width="480" height="270" frameBorder="0" class="giphy-embed" allowFullScreen></iframe><p> </center> </html> * 🗣 **Get hands dirty**‼️ * 📖 Documentation! Documentation! Documentation! * 🔎 (Not surprisingly) Learn to Google/ChatGPT/[ChatISA](https://chatisa.fsb.miamioh.edu/): what that error message means(I do that a lot 😆) .footnote[ <html> <hr> </html> **Source:** Slide is based on [Kia Ora's How I Learn a Technology](https://stats220.earo.me/01-intro.html#7). ] --- class: inverse center middle # The RStudio Interface, Setup and a Project-Oriented Workflow for your Analysis --- ## RStudio Interface .center[<img src="../../figures/rstudio-interface.png" width="80%">] .footnote[ <html> <hr> </html> image credit: Stuart Lee] ??? live --- ## Setting up RStudio (do this once) .pull-left[ Go to **Tools** > **Global Options**: .center[<img src="../../figures/rstudio-setup.PNG" width="100%">] ] .pull-right[ <br> <br> <br> <br> Uncheck `Workspace` and `History`, which helps to keep
working environment fresh and clean every time you switch between projects. ] --- ## What is a project? * Each university course is a project, and get your work organised. * A self-contained project is a folder that contains all relevant files, for example my `ISA 401/` 📁 includes: + `isa401.Rproj` + `lectures/` + `01_introduction/` * `01-introduction.Rmd`, etc. + `02_introduction_to_r/` * `02_introduction_to_r.Rmd`, etc. * All working files are **relative** to the **project root** (i.e. `isa401/`). * The project should just work on a different computer. --- class: inverse, center, middle #
101: Operators --- ## Assignment
has three assignment operators: <-, =, and ->, which can be used as follows. ``` r x1 <- 5 x2 = 5 5 -> x3 print(paste0("The values of x1, x2, and x3 are ", x1, ", ", x2, ", and ", x3, " respectively")) ``` ``` ## [1] "The values of x1, x2, and x3 are 5, 5, and 5 respectively" ``` The assignment consists of three parts: - The left-hand side: **variable names** (`x1` or `x2`), - The assignment operator: `<-` (or alternatively `=`), and - The right-hand side: **values** (`5`) --- ## Retrieval We can retrieve/call the object using its name as follows: ``` r x1 ``` ``` ## [1] 5 ``` ``` r x3 ``` ``` ## [1] 5 ``` --- ## Retrieval: Three Common Errors **Case issue:** object names in
are **case sensitive**. ``` r X1 # should be x1 instead of X1 (see last slide) ``` ``` ## Error in eval(expr, envir, enclos): object 'X1' not found ``` -- **Typo:** A spelling error of some sort ``` r y3 # should be x3 instead of y3 (see last slide) ``` ``` ## Error in eval(expr, envir, enclos): object 'y3' not found ``` -- **Object not saved:** e.g., you clicked **Enter** instead of **Ctrl + Enter** when running your code ``` r rm(x2) # removing x2 from the global environment to mimic error x2 # x2 is not in the global environment (see environment) ``` ``` ## Error in eval(expr, envir, enclos): object 'x2' not found ``` --- ## Arthimetic Operators While we will not specifically talk about doing math in
, the operators below are good to know. |Operator |Description | |:--------|:---------------------------| |+ |addition | |- |subtraction | |* |multiplication | |/ |division | |^ or ** |exponentiation | |x %% y |modulus (x mod y) 5%%2 is 1 | |x %/% y |integer division 5%/%2 is 2 | .footnote[ <html> <hr> </html> **Source:** The above table is scraped from [Quick-R: Operators](https://www.statmethods.net/management/operators.html). ] --- ## Logical Operators Logical operators are operators that return `TRUE` and `FALSE` values. |Operator |Description | |:---------|:------------------------| |< |less than | |<= |less than or equal to | |> |greater than | |>= |greater than or equal to | |== |exactly equal to | |!= |not equal to | |!x |Not x | |**x |y** | |x & y |x AND y | |isTRUE(x) |test if X is TRUE | .footnote[ <html> <hr> </html> **Source:** The above table is also scraped from [Quick-R: Operators](https://www.statmethods.net/management/operators.html). ] --- class: inverse, center, middle #
101: Syntax, Data Types, Data Structures and Functions --- ## Coding Style > .font150[Good coding style is like correct punctuation: you can manage without it, butitsuremakesthingseasiertoread. <br> -- [The tidyverse style guide](https://style.tidyverse.org)] ###
style guide ✅ `snake_case` .footnote[ <html> <hr> </html> **Source:** Slide is based on [Earo Wang's STAT 220 Slides](https://stats220.earo.me/01-intro.html#34) ] --- ##
is a Vector Language: Sample Output Learning from a **sample of ten obs. from the standard normal distribution** (i.e., `\(x \sim \mathcal{N}(0, \, 1)\)`) ``` r x_vec = rnorm(n=10, mean = 0, sd = 1) # generating std normal dist data x_vec > 0 # finding which elements in x are larger than 0 ``` ``` ## [1] TRUE TRUE FALSE FALSE FALSE FALSE TRUE FALSE TRUE TRUE ``` ``` r sum(x_vec > 0) # summing the number of elements (i.e., how many are > 0) ``` ``` ## [1] 5 ``` -- If we focus on the obtained outputs, we can see that **both** are vectors: - `x_vec > 0` returns a vector of size 10 (TRUE/FALSE for each element) - `sum(x_vec > 0)` returns a vector of size 1 **There are no scalars in R 😨!!!** --- ##
is a Vector Language: Types and Attributes .pull-left[ - **Vectors** come in **two flavors**, which differ by their **elements' types:** * **atomic vectors --** all elements **must have the same type** * **lists --** elements **can** be different - Vector have two important **attributes:** * **Dimension** turns vectors into matrices and arrays, checked using `dim(object_name)`. * The **class** attribute powers the S3 object system, checked using `class(object_name)`. ] .pull-right[ .center[<img src="https://d33wubrfki0l68.cloudfront.net/2ff3a6cebf1bb80abb2a814ae1cfc67b12817713/ae848/diagrams/vectors/summary-tree.png" width="100%">] ``` r class(x_vec) ``` ``` ## [1] "numeric" ``` ] .footnote[ <html> <hr> </html> **Source:** The content and image are from [Hadley Wickham's Advanced R: Chapter 3 on Vectors](https://adv-r.hadley.nz/vectors-chap.html) ] --- ##
is a Vector Language: Atomic Vectors .pull-left[ .center[<img src="https://d33wubrfki0l68.cloudfront.net/eb6730b841e32292d9ff36b33a590e24b6221f43/57192/diagrams/vectors/summary-tree-atomic.png" width="100%">] ] .pull-right[ ``` r dim(x_vec) ``` ``` ## NULL ``` **Atomic vectors have a dim of NULL, which distinguishes it from 1D arrays 🤯!!!** ] .footnote[ <html> <hr> </html> **Source:** The image is from [Hadley Wickham's Advanced R: Chapter 3 on Vectors](https://adv-r.hadley.nz/vectors-chap.html) ] --- ## Data Types: A Visual Introduction [1] .center[<img src="https://d33wubrfki0l68.cloudfront.net/8a3d360c80da1186b1373a0ff0ddf7803b96e20d/254c6/diagrams/vectors/atomic.png" width="60%">] - To check the **type of** an object in
, you can use the function `typeof`: ``` r typeof(x_vec) ``` ``` ## [1] "double" ``` .footnote[ <html> <hr> </html> **Source:** The image is from [Hadley Wickham's Advanced R: Chapter 3 on Vectors](https://adv-r.hadley.nz/vectors-chap.html) ] --- ## Data Types: A Visual Introduction [2] <div class="figure" style="text-align: center"> <img src="data:image/png;base64,#../../figures/four_popular_data_types.png" alt="The four data types that we will utilize the most in our course." width="100%" /> <p class="caption">The four data types that we will utilize the most in our course.</p> </div> --- ## Data Types: A Visual Introduction [3] <div class="figure" style="text-align: center"> <img src="data:image/png;base64,#../../figures/legos-jbryan-types.png" alt="A visual representation of different types of atomic vectors" width="100%" /> <p class="caption">A visual representation of different types of atomic vectors</p> </div> .footnote[ <html> <hr> </html> **Source:** The images are from the excellent [lego-rstats GitHub Repository by Jenny Bryan](https://github.com/jennybc/lego-rstats#readme) ] --- ## Data Types: Formal Definitions Each of the four primary types has a special syntax to create an individual value: - Logicals can be written in full (`TRUE` or `FALSE`), or abbreviated (`T` or `F`). - Doubles can be specified in decimal (`0.1234`), scientific (`1.23e4`), or hexadecimal (`0xcafe`) form. * There are three special values unique to doubles: `Inf`, `-Inf`, and `NaN` (not a number). * These are special values defined by the floating point standard. - Integers are written similarly to doubles but must be followed by `L`(`1234L`, `1e4L`, or `0xcafeL`), and can not contain fractional values. - Strings are surrounded by `"` (e.g., `"hi"`) or `'` (e.g., `'bye'`). Special characters are escaped with `\` see `?Quotes` for full details. .footnote[ <html> <hr> </html> **Source:** The content of this slide is verbatim from [Hadley Wickham's Advanced R: Chapter 3 on Vectors](https://adv-r.hadley.nz/vectors-chap.html#scalars) ] --- ## Data Structures: Atomic Vector (1D) <div class="figure" style="text-align: center"> <img src="data:image/png;base64,#../../figures/legos-jbryan-types.png" alt="A visual representation of different types of atomic vectors" width="100%" /> <p class="caption">Keeping the visual representation of different types of atomic vectors in your head!!</p> </div> ``` r dept = c('ACC', 'ECO', 'FIN', 'ISA', 'MGMT') nfaculty = c(18L, 19L, 14L, 25L, 22L) ``` .footnote[ <html> <hr> </html> **Source:** The images are from the excellent [lego-rstats GitHub Repository by Jenny Bryan](https://github.com/jennybc/lego-rstats#readme) ] --- ## Data Structures: 1D ➡️ 2D [Visually] .center[<img src="../../figures/legos-jbryan-structures.png" width="92%">] .footnote[ <html> <hr> </html> **Source:** The images are from the excellent [lego-rstats GitHub Repository by Jenny Bryan](https://github.com/jennybc/lego-rstats#readme) ] --- ## Data Structures: 1D ➡️ 2D [In Code] ``` r library(tibble) fsb_tbl <- tibble( department = dept, count = nfaculty, percentage = count / sum(count)) fsb_tbl ``` ``` ## # A tibble: 5 × 3 ## department count percentage ## <chr> <int> <dbl> ## 1 ACC 18 0.184 ## 2 ECO 19 0.194 ## 3 FIN 14 0.143 ## 4 ISA 25 0.255 ## 5 MGMT 22 0.224 ``` --- ## Data Structures: Lists [1] An object contains elements of **different data types**. .center[<img src="../../figures/legos-jbryan-list.png" width="25%">] .footnote[ <html> <hr> </html> **Source:** The image is adapted from the excellent [lego-rstats GitHub Repository by Jenny Bryan](https://github.com/jennybc/lego-rstats/blob/master/lego-rstats_014.jpg) ] --- ## Data Structures: Lists [2] .center[<img src="https://d33wubrfki0l68.cloudfront.net/9628eed602df6fd55d9bced4fba0a5a85d93db8a/36c16/diagrams/vectors/list.png" width="100%">] ``` r lst <- list( # list constructor/creator * 1:3, # atomic double/numeric vector of length = 3 * "a", # atomic character vector of length = 1 (aka scalar) * c(TRUE, FALSE, TRUE), # atomic logical vector of length = 3 * c(2.3, 5.9) # atomic double/numeric vector of length =3 ) lst # printing the list ``` ``` ## [1] "1:3" "a" "c(TRUE, FALSE, TRUE)" ## [4] "c(2.3, 5.9)" ``` .footnote[ <html> <hr> </html> **Source:** Image is from [Hadley Wickham's Advanced R: Chapter 3 on Vectors](https://adv-r.hadley.nz/vectors-chap.html#lists) ] --- ## Data Structures: Lists [3] .pull-left[ ### data type ``` r typeof(lst) # primitive type ``` ``` ## [1] "list" ``` ### data class ``` r class(lst) # type + attributes ``` ``` ## [1] "list" ``` ] .pull-right[ ### data structure ``` r str(lst) # sublists can be of diff lengths and types ``` ``` ## List of 4 ## $ : int [1:3] 1 2 3 ## $ : chr "a" ## $ : logi [1:3] TRUE FALSE TRUE ## $ : num [1:2] 2.3 5.9 ``` ] .footnote[ <html> <hr> </html> **Source:** Slide is based on [Earo Wang's STAT 220 Slides](https://stats220.earo.me/02-import-export.html#6). ] --- ## Data Structures: Lists [3] A list can contain other lists, i.e. **recursive** ``` r # a named list str( * list(first_el = lst, second_el = iris) ) ``` ``` ## List of 2 ## $ first_el :List of 4 ## ..$ : int [1:3] 1 2 3 ## ..$ : chr "a" ## ..$ : logi [1:3] TRUE FALSE TRUE ## ..$ : num [1:2] 2.3 5.9 ## $ second_el:'data.frame': 150 obs. of 5 variables: ## ..$ Sepal.Length: num [1:150] 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ... ## ..$ Sepal.Width : num [1:150] 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ... ## ..$ Petal.Length: num [1:150] 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ... ## ..$ Petal.Width : num [1:150] 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ... ## ..$ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ... ``` --- ## Data Structures: Lists [4] .pull-left[ Subset by `[]` ``` r lst[1] ``` ``` ## [[1]] ## [1] 1 2 3 ``` ] .pull-right[ Subset by `[[]]` ``` r lst[[1]] ``` ``` ## [1] 1 2 3 ``` ] .center[<img src="../../figures/pepper.png" width="50%">] .footnote[ <html> <hr> </html> **Sources:** The slide is based on [Earo Wang's STAT 220 slides](https://stats220.earo.me/02-import-export.html#10) and image is from [Hadley Wickham's Tweet on Indexing lists in R](https://twitter.com/hadleywickham/status/643381054758363136?lang=en). ] --- ## Data Structures: Matrices A matrix is a **2D data structure** made of **one/homogeneous data type.** .pull-left[ ``` r x_mat = matrix( sample(1:10, size = 4), nrow = 2, ncol = 2 ) str(x_mat) # its structure? ``` ``` ## int [1:2, 1:2] 7 9 5 10 ``` ``` r x_mat # printing it nicely print('-----------------') *x_mat[1, 2] # subsetting ``` ``` ## [,1] [,2] ## [1,] 7 5 ## [2,] 9 10 ## [1] "-----------------" ## [1] 5 ``` ] -- .pull-right[ ``` r x_char = matrix( sample(letters, size = 12), nrow = 3, ncol =4) x_char ``` ``` ## [,1] [,2] [,3] [,4] ## [1,] "w" "s" "o" "d" ## [2,] "l" "h" "v" "n" ## [3,] "p" "g" "z" "u" ``` ``` r *x_char[1:2, 2:3] # subsetting ``` ``` ## [,1] [,2] ## [1,] "s" "o" ## [2,] "h" "v" ``` ] --- ## Data Structures: Data Frames [1] .center[<img src="https://d33wubrfki0l68.cloudfront.net/9ec5e1f8982238a413847eb5c9bbc5dcf44c9893/bc590/diagrams/vectors/summary-tree-s3-2.png" width="22%">] > .font150[If you do data analysis in R, you’re going to be using data frames. A data frame is a named list of vectors with attributes for `(column)` `names`, `row.names`, and its class, “data.frame”. -- [Hadley Wickham](https://adv-r.hadley.nz/vectors-chap.html#list-array)] .footnote[ <html> <hr> </html> **Source:** Image is from [Hadley Wickham's Advanced R: Chapter 3 on Vectors](https://adv-r.hadley.nz/vectors-chap.html#list-array) ] --- ## Data Structures: Data Frames [2] ``` r df1 <- data.frame(x = 1:3, y = letters[1:3]) typeof(df1) # showing that its a special case of a list ``` ``` ## [1] "list" ``` ``` r attributes(df1) # but also is of class data.frame ``` ``` ## $names ## [1] "x" "y" ## ## $class ## [1] "data.frame" ## ## $row.names ## [1] 1 2 3 ``` In contrast to a regular list, a data frame has **an additional constraint: the length of each of its vectors must be the same.** This gives data frames their **rectangular structure.** .footnote[ <html> <hr> </html> **Source:** Content is from [Hadley Wickham's Advanced R: Chapter 3 on Vectors](https://adv-r.hadley.nz/vectors-chap.html#list-array) ] --- ## Data Structures: Data Frames [3] As noted in the creation of `df1`, columns in a data frame can be of different types. Hence, it is more widely used in data analysis than matrices. .center[<img src="../../figures/legos-jbryan-dataframe-w-text.png" width="40%">] .footnote[ <html> <hr> </html> **Source:** The image is adapted from the excellent [lego-rstats GitHub Repository by Jenny Bryan](https://github.com/jennybc/lego-rstats/blob/master/lego-rstats_014.jpg) ] --- ## Data Structures: So What is a Tibble Anyway? > Tibble is a **modern reimagining of the data frame**. Tibbles are designed to be (as much as possible) **drop-in replacements for data frames** that fix those frustrations. A concise, and fun, way to summarise the main differences is that tibbles are **lazy and surly: they do less and complain more**. -- [Hadley Wickham](https://adv-r.hadley.nz/vectors-chap.html#list-array) .pull-left[[<img src="https://d33wubrfki0l68.cloudfront.net/565916198b0be51bf88b36f94b80c7ea67cafe7c/7f70b/cover.png" height="320px">](https://adv-r.hadley.nz)] To learn more about the basics of tibble, please consult the reference below: * [Data frames and tibbles (Click and read from 3.6 up to and including 3.6.5)](https://adv-r.hadley.nz/vectors-chap.html#list-array) --- ## Functions A function call consists of the **function name** followed by one or more **argument** within parentheses. ``` r temp_high_forecast = c(86, 84, 85, 89, 89, 84, 81) mean(x = temp_high_forecast) ``` ``` ## [1] 85.42857 ``` * function name: `mean()`, a built-in R function to compute mean of a vector * argument: the first argument (LHS `x`) to specify the data (RHS `temp_high_forecast`) .footnote[ <html> <hr> </html> **Source:** Slide is based on [Earo Wang's STAT 220 Slides](https://stats220.earo.me/01-intro.html#41) ] --- ## Function Help Page Check the function's help page with `?mean` ### Class Activity > _Please take 2 minutes to investigate the help page for `mean` in R Studio._ ```r mean(x = temp_high_forecast, trim = 0, na.rm = FALSE, ...) ``` * Read **Usage** section + What arguments have default values? * Read **Arguments** section + What does `trim` do? * Run **Example** code
−
+
02
:
00
.footnote[ <html> <hr> </html> **Source:** Slide is based on [Earo Wang's STAT 220 Slides](https://stats220.earo.me/01-intro.html#42) ] --- ## Function Arguments .pull-left[ ### Match by **positions** ``` r mean(temp_high_forecast, 0.1, TRUE) ``` ``` ## [1] 85.42857 ``` ] .pull-right[ ### Match by **names** ``` r mean(x = temp_high_forecast, trim = 0.1, na.rm = TRUE) ``` ``` ## [1] 85.42857 ``` ] .footnote[ <html> <hr> </html> **Source:** Slide is based on [Earo Wang's STAT 220 Slides](https://stats220.earo.me/01-intro.html#43) ] --- ## Use Functions from Packages .pull-left[ ``` r dplyr::cummean(temp_high_forecast) ``` ``` ## [1] 86.00000 85.00000 85.00000 86.00000 86.60000 86.16667 85.42857 ``` ``` r dplyr::first(temp_high_forecast) ``` ``` ## [1] 86 ``` ``` r dplyr::last(temp_high_forecast) ``` ``` ## [1] 81 ``` ] .pull-right[ <br> <br> <br> <br> .center[ <img src="https://stats220.earo.me/img/install-library.JPG" height="240px"> ] ] .footnote[ <html> <hr> </html> **Source:** Slide is based on [Earo Wang's STAT 220 Slides](https://stats220.earo.me/01-intro.html#44) ] --- # Write Your Own Functions ``` r # function_name <- function(arguments) { # function_body # } my_mean <- function(x, na.rm = FALSE) { summation <- sum(x, na.rm = na.rm) summation / length(x) } my_mean(temp_high_forecast) ``` ``` ## [1] 85.42857 ``` .footnote[ <html> <hr> </html> **Source:** Slide is based on [Earo Wang's STAT 220 Slides](https://stats220.earo.me/01-intro.html#45) ] --- class: inverse, center, middle # Demo --- # Your First
Script File Refer to our in class code. --- class: inverse, center, middle # Recap --- # Summary of Main Points By now, you should be able to do the following: - Describe why we are using
in this course? - Understand the syntax, data structures and functions. - Utilize the project workflow in
and create your first
script. --- # Things to Do to Prepare for Our Next Class - Go over your notes, read the **references below**, and **complete** the [self-paced R tutorial](http://rstudio.fsb.miamioh.edu:3838/megahefm/isa401/datatypes/). - Complete [Assignment 02](https://miamioh.instructure.com/courses/223961/quizzes/663249) on Canvas. .pull-left[ .center[[<img src="https://d33wubrfki0l68.cloudfront.net/b88ef926a004b0fce72b2526b0b5c4413666a4cb/24a30/cover.png" height="250px">](https://r4ds.had.co.nz)] .small[ * [Workflow: basics](https://r4ds.had.co.nz/workflow-basics.html) * [Workflow: scripts](https://r4ds.had.co.nz/workflow-scripts.html) * [Workflow: project](https://r4ds.had.co.nz/workflow-projects.html) ] ] .pull-right[ .center[[<img src="https://d33wubrfki0l68.cloudfront.net/565916198b0be51bf88b36f94b80c7ea67cafe7c/7f70b/cover.png" height="250px">](https://adv-r.hadley.nz)] .small[ * [Names and values](https://adv-r.hadley.nz/names-values.html) * [Vectors](https://adv-r.hadley.nz/vectors-chap.html) * [Subsetting](https://adv-r.hadley.nz/subsetting.html) ] ]