class: center, middle, inverse, title-slide # ⚒️ 🗜️ Writing functions in ## IASSL: 21/25 Feb, 2022 ### ### Dr Thiyanga Talagala --- <style type="text/css"> .remark-slide-content { font-size: 30px; } </style> ## Functions in R 👉🏻 Perform a specific task according to a set of instructions. -- 👉🏻 Some functions we have discussed so far, > `c`, `matrix`, `array`, `list`, `data.frame`, `str`, `dim`, `length`, `nrow`, `plot` --- ## Functions in R (cont.) 👉🏻 There are basically two types of functions: > 💻 Built-in functions Already created or defined in the programming framework to make our work easier. > 👨 User-defined functions Sometimes we need to create our own functions for a specific purpose. --- .pull-left[ ## Syntax ```r name <- function(arg1, aug2, ...){ <FUNCTION BODY> return(value) } ``` ] .pull-right[ ### Example ```r cal_power <- function(x){ a <- x^2; b <- x^3 out <- c(a, b) names(out) <- c("squared", "cubed") out # or return(out) } ``` ### Evaluation ```r cal_power(2) ``` ``` squared cubed 4 8 ``` ] -- 👉 Functions are created using the `function()` --- class: inverse ## Basic components of a function **1. Function name** --- .pull-left[ ### Syntax ```r name <- function(arg1, aug2, ...){ <FUNCTION BODY> return(value) } ``` ] .pull-right[ ### Example ```r *cal_power <- function(x){ a <- x^2 b <- x^3 out <- c(a, b) names(out) <- c("squared", "cubed") out # or return(out) } ``` ] .content-box-yellow[Function name: **`cal_power`**] --- .content-box-yellow[Function name: **`cal_power`**] - use verbs, where possible - should be meaningful - use an underscore (_) to separate words - avoid names of built-in functions - start with lower case letters. Note that R is a case sensitive language --- class: inverse ## Basic components of a function 1. Function name **2. Function arguments/ inputs** --- .pull-left[ ### Syntax ```r name <- function(arg1, aug2, ...){ <FUNCTION BODY> return(value) } ``` ] .pull-right[ ### Example ```r *cal_power <- function(x){ a <- x^2 b <- x^3 out <- c(a, b) names(out) <- c("squared", "cubed") out # or return(out) } ``` ] .content-box-yellow[Function arguments: **`x`**] - value passed to the function to obtain the function's result. --- class: inverse ## Basic components of a function 1. Function name 2. Function arguments/ inputs **3. Function body** --- .pull-left[ ### Syntax ```r name <- function(arg1, aug2, ...){ <FUNCTION BODY> return(value) } ``` ] .pull-right[ ### Example ```r cal_power <- function(x){ * a <- x^2 * b <- x^3 * out <- c(a, b) * names(out) <- c("squared", "cubed") * out # or return(out) } ``` ] .content-box-yellow[Function body] --- ## Function with single line .pull-left[ ### Mathod 1 ```r cal_sqrt <- function(x){ x^2 } ``` ] .pull-right[ ### Method 2 ```r cal_sqrt <- function(x) x^2 ``` ] --- ### Function body (Cont.) - {} do not go in one single line, always two lines ```r # Good --- if(y == 2){ print("even") } # Bad --- if(y == 2){ print("even")} ``` --- **Load the mozzie dataset** ```r library(mozzie) data(mozzie); head(mozzie, 2) ``` ``` ID Year Week Colombo Gampaha Kalutara Kandy Matale Nuwara Eliya Galle 1 1 2008 52 15 7 1 11 4 0 0 2 2 2009 1 44 23 5 16 21 2 0 Hambantota Matara Jaffna Kilinochchi Mannar Vavuniya Mulative Batticalo 1 6 22 0 0 8 0 0 1 2 5 18 1 0 0 0 0 0 Ampara Trincomalee Kurunagala Puttalam Anuradhapura Polonnaruwa Badulla 1 0 0 2 1 2 0 1 2 1 1 10 5 0 0 1 Monaragala Ratnapura Kegalle 1 1 2 16 2 0 1 25 ``` -- > Use Min-Max transformation to rescale all the districts variables onto 0-1 range. > Min-Max transformation is `\(\frac{x_i-min(x)}{max(x)-min(x)}\)` where `\(x=(x_1, x_2, ...x_n)\)`. --- ** Min-Max transformation on `mozzie`** ```r minmax.colombo <- (mozzie$Colombo - min(mozzie$Colombo, na.rm = TRUE)) / (max(mozzie$Colombo, na.rm=TRUE) - min(mozzie$Colombo, na.rm=TRUE)) head(minmax.colombo) # Colombo district ``` ``` [1] 0.03157895 0.09263158 0.08210526 0.12000000 0.11157895 0.06105263 ``` -- ```r minmax.gampaha <- (mozzie$Gampaha - min(mozzie$Gampaha, na.rm = TRUE)) / (max(mozzie$Gampaha, na.rm = TRUE) - min(mozzie$Gampaha, na.rm = TRUE)) head(minmax.gampaha) # Gampaha district ``` ``` [1] 0.02734375 0.08984375 0.07421875 0.08984375 0.09375000 0.06640625 ``` -- ```r minmax.kalutara <- (mozzie$Gampaha - min(mozzie$Kalutara, na.rm = TRUE)) / (max(mozzie$Kalutara, na.rm = TRUE) - min(mozzie$Kalutara, na.rm = TRUE)) head(minmax.kalutara) # Kalutara district ``` ``` [1] 0.09333333 0.30666667 0.25333333 0.30666667 0.32000000 0.22666667 ``` --- ## Copying-and-pasting > You could easily make errors. > A mistake copied becomes a mistake repeated. -- ## When should you write a function? - Whenever you need to copy and paste a block of codes many times - A function is a reusable block of programming code designed to do a specific task. - If you don't find a suitable built-in function to serve your purpose, you can write your own function - To share your work with others --- # Writing a function ### Step 1: Function name ```r rescale_minmax ``` -- ### Step 2: Assign your function to the name ```r rescale_minmax <- ``` -- ### Step 3: Tell R that you are writing a function ```r_ rescale_minmax <- function(x) # Arguments/inputs should be defined inside () ``` --- ### Step 4: Curly braces define the start and the end of your work ```r rescale_minmax <- function(x){ # Task # output } ``` --- ## Step 5: Function inputs, task and outputs **Find all the inputs that correspond to a given function output?** ```r (x - min(x, na.rm = TRUE)) / (max(x, na.rm=TRUE) - min(x, na.rm=TRUE)) ``` --- # Step 6: Complete your function ```r rescale_minmax <- function(x){ (x - min(x, na.rm = TRUE)) / (max(x, na.rm=TRUE) - min(x, na.rm=TRUE)) } ``` --- # Step 7: Check your function with a few different inputs ```r rescale_minmax <- function(x){ (x - min(x, na.rm = TRUE)) / (max(x, na.rm=TRUE) - min(x, na.rm=TRUE)) } ``` -- ```r rescale_minmax(c(1, 200, 250, 80, NA)) ``` ``` [1] 0.0000000 0.7991968 1.0000000 0.3172691 NA ``` --- class: duke-orange, center, middle # Your turn --- # Functions are for humans and computers - Descriptive names for variables. - Comment your code. --- class: duke-orange, center, middle # Your turn --- Write a function to compute z-score value of a A/L Mathematics student given the marks of the student. Assume mean(Mathematics) = 60, sd(Mathematics) = 10, mean(Chemistry) = 45, sd(Chemistry) = 20, mean(Physics) = 55, sd(Physics) = 5.
05
:
00
--- class: center, middle ## Thank you! All rights reserved by [Thiyanga S. Talagala](https://thiyanga.netlify.app/)