class: title-slide, left, bottom # Các lệnh if, else, for, while ---- ## **Khóa học: Hướng dẫn sử dụng R để xử lý dữ liệu** ### Biên soạn: Duc Nguyen - www.tuhocr.com (Tự học R chấm com) ### Đăng ký: tuhocr.com@gmail.com --- class: inverse, middle, center, animated, fadeIn # Control structure Các lệnh `if`, `else`, `for`, `while`, ... giúp xử lý dữ liệu theo điều kiện. --- class: animated, fadeIn # Control structure Các lệnh này áp dụng khi xây dựng hàm (function) trong R. - `if`, `else`: Thực hiện theo điều kiện - `for`: Thực hiện vòng lặp trong một số lần nhất định - `while`: Thực hiện vòng lặp theo điều kiện - `repeat`: Thực hiện vòng lặp vô hạn - `break`: Ngưng vòng lặp - `next`: Chuyển qua điều kiện khác - `return`: Thoát khỏi điều kiện --- class: animated, fadeIn # Lệnh `if` ```r if(<condition>) { # do something } else { # do something else } if(<condition1>) { # do something } else if(<condition2>) { # do something different } else { # do something different } ``` --- class: animated, fadeIn # Lệnh `if` .pull-left[ ```r > x <- 8 > if(x > 3) { y <- 10 } else { y <- 0 } > y [1] 10 ``` ] .pull-right[ ```r y <- if(x > 3) { 10 } else { 0 } > x <- -5 > y [1] 0 ``` ] --- class: animated, fadeIn # Lệnh `if` Ta có thể không cần khai báo lệnh `else` nếu khai báo nhiều lệnh `if` bao trùm các điều kiện khác nhau. .pull-left[ ```r if(<condition1>) { } if(<condition2>) { } ``` ] .pull-right[ ```r > if(x > 3) { y <- 10 } > if(x <= 3) { y <- 1 } > x <- 3 > y [1] 1 ``` ] --- class: animated, fadeIn # Lệnh `for` Lệnh này tạo vòng lặp trên các thành phần của đối tượng theo `variable`. ```r for(i in 1:6) { # Tương ứng mỗi giá trị của vector từ 1 đến 6 thì print(i) # biến/variable `i` được in ra } ``` ``` ## [1] 1 ## [1] 2 ## [1] 3 ## [1] 4 ## [1] 5 ## [1] 6 ``` --- class: animated, fadeIn # Lệnh `for` Các lệnh `for` này xuất ra kết quả tương tự nhau. ```r x <- c("a", "b", "c", "d") for(i in 1:4) { # Biến `i` được subset từ 1 đến 4 theo vị trí index trong vector `x` print(x[i]) } for(i in seq_along(x)) { # Lệnh seq_along(x) in ra vị trí index từ 1 đến 4 trong vector `x` print(x[i]) } for(letter in x) { # Biến `letter` ở trong vector `x` in ra lần lượt các thành phần print(letter) } for(i in 1:4) print(x[i]) # Cách viết ngắn gọn trên cùng 1 hàng ``` --- class: animated, fadeIn # Nested for loops Lệnh `for` có thể được lồng ghép vào các vòng lặp khác. Thường rất khó để hiểu. ```r > x <- matrix(1:6, 2, 3) [,1] [,2] [,3] [1,] 1 3 5 [2,] 2 4 6 # ↓ Lệnh seq_len() đánh số từ 1 đến giá trị hiện hữu của vector (positive integer) > for(i in seq_len(nrow(x))) { # Mỗi giá trị của i từ 1:2 for(j in seq_len(ncol(x))) { # Mỗi giá trị của j từ 1:3 print(x[i, j]) # In thành phần trong ma trận hàng i, cột j } } [1] 1 [1] 3 [1] 5 [1] 2 [1] 4 [1] 6 ``` --- class: animated, fadeIn # Nested for loops (break it down) .pull-left[ ```r > seq_len(nrow(x)) [1] 1 2 > seq_len(ncol(x)) [1] 1 2 3 > for(i in 1:2) { for(j in 1:3) { print(i) } } [1] 1 [1] 1 [1] 1 [1] 2 [1] 2 [1] 2 ``` ] .pull-right[ ```r > seq_len(nrow(x)) [1] 1 2 > seq_len(ncol(x)) [1] 1 2 3 > for(i in 1:2) { for(j in 1:3) { print(j) } } [1] 1 [1] 2 [1] 3 [1] 1 [1] 2 [1] 3 ``` ] --- class: animated, fadeIn # Nested for loops Ghép lại kết quả để hiểu lệnh ban đầu. .pull-left[ ```r > for(i in 1:2) { for(j in 1:3) { print(c(i, j)) } } [1] 1 1 # Lặp `i` trước rồi lặp `j` sau [1] 1 2 # Lần lượt có vector chứa [1] 1 3 # tổ hợp i và j [1] 2 1 [1] 2 2 [1] 2 3 ``` ] .pull-right[ ```r > x # ma trận [,1] [,2] [,3] [1,] 1 3 5 [2,] 2 4 6 > for(i in 1:2) { for(j in 1:3) { print(x[i, j]) } } [1] 1 [1] 3 [1] 5 [1] 2 [1] 4 [1] 6 ``` ] --- class: animated, fadeIn # Lệnh `while` Bản chất lệnh `while` là dạng kết hợp giữa lệnh `if` và lệnh `for` khi nó kiểm tra điều kiện rồi thực hiện vòng lặp. Cần lưu ý khi sử dụng rất dễ tạo ra vòng lặp vô hạn làm treo máy (bấm nút `STOP` ở console khi ở tình huống này). ```r > count <- 0 # Cho vector `count` có giá trị 0 > while(count < 4) { # Nếu `count` nhỏ hơn 4 print(count) # In vector `count` count <- count + 1 # Vector `count` lúc này là chính nó được cộng thêm 1 } [1] 0 [1] 1 [1] 2 [1] 3 ``` --- class: animated, fadeIn # Lệnh `while` Cách lồng ghép giữa lệnh `while` và lệnh `if`. `R` xét điều kiện đi từ trên xuống và từ trái qua. ```r z <- 5 while(z >= 3 && z <= 10) { print(z) coin <- rbinom(1, 1, 0.5) if(coin == 1) { ## random walk z <- z + 1 } else { z <- z - 1 } } [1] 5 # Kết quả ra một dãy số rất dài đến khi [1] 6 ... [1] 7 [1] 3 # ra ngoài điều kiện cho `z` thì dừng ``` --- class: animated, fadeIn # Lệnh `repeat` Lệnh `repeat` tạo ra vòng lặp vô hạn và chỉ dừng lại khi dùng lệnh `break`. ```r result <- c("Hello World") i <- 1 repeat { print(result) i <- i + 1 if(i > 5) { break } } [1] "Hello World" [1] "Hello World" [1] "Hello World" [1] "Hello World" [1] "Hello World" ``` --- class: animated, fadeIn # Lệnh `next` và `return` Lệnh `next` dùng để cho qua (skip) một vòng lặp. Lệnh `return` sẽ kết thúc một hàm và gán kết quả vào một đối tượng chỉ định. .pull-left[ ```r > for(i in 1:10) { if(i <= 3) { next } print(i) } [1] 4 [1] 5 [1] 6 [1] 7 [1] 8 [1] 9 [1] 10 ``` ] .pull-right[ ```r > for(i in 1:10) { if(i <= 3) { next } return(i) } > i [1] 4 ``` ]