Chuyển đến nội dung chính

Hướng dẫn Điều kiện và Luồng điều khiển trong R

Tìm hiểu về toán tử quan hệ để so sánh đối tượng R và toán tử logic để kết hợp các giá trị boolean TRUE và FALSE. Bạn cũng sẽ xây dựng các câu lệnh điều kiện.
· 13 phút đọc

Khám phá cùng AI

Lưu đồ các câu lệnh điều khiển luồng
Luồng điều khiển (Nguồn: w3schools)

Toán tử quan hệ

Toán tử quan hệ, còn được gọi là comparators (toán tử so sánh), giúp bạn xem một R-Object liên hệ thế nào với R-object khác. Ví dụ, bạn có thể kiểm tra hai đối tượng có bằng nhau hay không, việc này thực hiện với dấu == (hai dấu bằng). Một phép so sánh lôgic cho kết quả TRUE ở cả hai vế sẽ trả về giá trị lôgic TRUE vì TRUE bằng TRUE, như dưới đây.

TRUE == TRUE
TRUE

Tuy nhiên, nếu một vế là TRUE và vế kia là FALSE, bạn sẽ nhận được giá trị lôgic FALSE làm đầu ra.

TRUE == FALSE
FALSE

Ngoài biến lôgic, bạn có thể kiểm tra tính bằng nhau của các kiểu khác.

Hãy so sánh chuỗi và số.

100 == 100
TRUE
100 == 200
FALSE
'tutorial' == 'R'
FALSE
  • Đối lập với toán tử bằng là toán tử bất bằng, biểu diễn bằng dấu != (kết hợp dấu chấm than và dấu bằng).

Bây giờ tất cả các điều kiện trước đó cho ra FALSE sẽ chuyển thành TRUE, hãy kiểm tra nhé!

100 != 200
TRUE
'tutorial' != 'R'
TRUE
TRUE != FALSE
TRUE

Tương tự, toán tử bất bằng cũng có thể dùng cho số và các R-Object khác như ma trận, vector và list.

  • Nếu bạn muốn kiểm tra giữa hai R-Object thì cái nào lớn hơn hoặc nhỏ hơn cái kia thì sao? Dĩ nhiên là được, dùng dấu < và > (nhỏ hơn và lớn hơn).

    Hãy xem ví dụ số học trước.

2 > 10
FALSE
-200 < 0
TRUE

Như bạn thấy, điều này tự giải thích: $2$ không lớn hơn $10$ và $-200$ nhỏ hơn $0$. Nhưng với chuỗi hay ký tự thì sao? Hãy xem đạt được thế nào.

Có vẻ R ưu tiên thứ tự chữ cái khi quyết định chuỗi hay ký tự nào lớn hơn.

Trong ví dụ dưới đây, vì t đứng sau R theo thứ tự chữ cái; do đó, t lớn hơn R.

'tutorial' > 'RRRRRRRRR'
TRUE

Lưu ý rằng trong R và hầu hết ngôn ngữ lập trình, TRUE được hiểu số là 1 và FALSE là 0. Vì vậy theo phép ánh xạ này, TRUE sẽ lớn hơn FALSE.

TRUE > FALSE
TRUE
  • Bạn cũng có thể kiểm tra xem một R-object có lớn hơn hoặc bằng (>=) (hoặc nhỏ hơn hoặc bằng <=) một R-object khác không. Để làm vậy, dùng dấu nhỏ hơn hoặc lớn hơn kết hợp với dấu bằng. Tức là nếu một trong hai điều kiện (nhỏ hơn hoặc bằng / lớn hơn hoặc bằng) là TRUE, thì toàn bộ điều kiện sẽ là TRUE.
5 >= 5 # 5 không lớn hơn 5 nhưng bằng, nên trả về TRUE.
TRUE
5 >= 10
FALSE

Bạn có thể tìm hiểu về kiểu dữ liệu R trong hướng dẫn DataCamp này. Nó cho thấy R xử lý list, ma trận và vector khá tốt.

Vậy các toán tử so sánh của R có xử lý được vector R không? Cùng tìm hiểu.

Ví dụ, bạn có một vector hàng ghi nhận số lượt xem bạn nhận được cho hướng dẫn DataCamp gần đây trong 10 ngày qua. Giờ bạn muốn biết những ngày nào có từ 100 lượt xem trở lên. Bạn có thể dùng ngay dấu lớn hơn hoặc bằng.

datacamp_views <- c(100,20,5,200,60,88,190,33,290,64)
length(datacamp_views)
10
datacamp_views >= 100
  1. TRUE
  2. FALSE
  3. FALSE
  4. TRUE
  5. FALSE
  6. FALSE
  7. TRUE
  8. FALSE
  9. TRUE
  10. FALSE

Như bạn thấy từ đầu ra trên, ở phần tử thứ nhất, thứ tư, thứ bảy và thứ chín có kết quả TRUE, tức là những ngày đó lượt xem từ 100 trở lên.

Tương tự, bạn cũng có thể so sánh hai vector hoặc thậm chí hai ma trận.

youtube_views <- c(10,20,1000,64,100,9,19,3,90,4)

Với cách này, bạn có thể xây dựng một ứng dụng đơn giản để tìm ra khi nào lượt xem hướng dẫn DataCamp của bạn nhiều hơn lượt xem video YouTube của bạn hoặc ngược lại.

Hoạt động trong R như sau: nó so sánh hai vector theo từng phần tử. Ví dụ, trong đầu ra dưới đây, nếu xét phần tử đầu tiên của cả hai vector, bạn sẽ thấy vector lượt xem DataCamp có giá trị 100, trong khi vector kia có giá trị 10, nên trả về TRUE.

datacamp_views > youtube_views
  1. TRUE
  2. FALSE
  3. FALSE
  4. TRUE
  5. FALSE
  6. TRUE
  7. TRUE
  8. TRUE
  9. TRUE
  10. TRUE

Hãy nhanh chóng so sánh hai biểu thức số học. Nếu bạn nhớ toán học cơ bản, có quy tắc gọi là BODMAS (hoặc PEMDAS), tức là ngoặc, lũy thừa, nhân chia, cộng trừ, dựa trên đó giải mọi biểu thức. Bạn sẽ dùng cùng quy tắc để giải hai biểu thức R dưới đây.

-6 * 5 + 2 >= -10 + 1 #bên trái thực hiện nhân trước rồi cộng theo BODMAS
FALSE

So sánh ma trận

Khả năng xử lý các cấu trúc dữ liệu khác nhau cho so sánh của R không dừng ở vector. Ma trận và toán tử quan hệ cũng hoạt động nhịp nhàng cùng nhau!

Thay vì vector (như ví dụ trước), dữ liệu của DataCamp và YouTube giờ được lưu trong ma trận có tên views. Hàng thứ nhất chứa thông tin DataCamp; hàng thứ hai là thông tin YouTube. Bạn sẽ dùng hàm matrix tích hợp của R để tạo một ma trận với sự trợ giúp của hai vector datacamp và youtube đã tạo ở ví dụ trước.

datacamp_views <- c(100,20,5,200,60,88,190,33,290,64)
youtube_views <- c(10,20,1000,64,100,9,19,3,90,4)
views <- matrix(c(datacamp_views, youtube_views), nrow = 2, byrow = TRUE)
views
Một ma trận: 2 × 10 kiểu dbl
10020520060881903329064
10201000641009193904

Hãy tìm xem khi nào lượt xem của cả datacamp cũng như youtube bằng 20.

views == 20
Một ma trận: 2 × 10 kiểu lgl
FALSETRUEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSE
FALSETRUEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSE

Tuyệt! Vậy bạn đã hiểu cách các toán tử quan hệ hoạt động, giờ hãy chuyển sang toán tử logic.

Toán tử logic

R giúp bạn kết hợp kết quả của các toán tử quan hệ bằng cách cung cấp các toán tử logic sau:

  • Toán tử AND ( & )
  • Toán tử OR ( | )
  • Toán tử NOT ( ! )

Hãy lần lượt xem từng toán tử.

  • Toán tử AND: Như các ngôn ngữ lập trình khác, toán tử AND của R nhận hai giá trị lôgic và chỉ trả về TRUE khi cả hai đều đúng, nếu không sẽ trả về FALSE.
Bảng chân trị toán tử AND
Bảng chân trị toán tử AND

Let's look at some of the self-explanatory examples.
TRUE & TRUE # 1.1 = 1
TRUE
TRUE & FALSE # 1.0 = 0
FALSE
FALSE & FALSE # 0.0 = 0
FALSE
FALSE & TRUE # 0.1 = 0
FALSE

Tương tự, thay vì dùng các giá trị lôgic như trên, bạn có thể dùng kết quả của các toán tử so sánh với các toán tử này.

x <- 100
x < 200 & x >= 100  # vì x nhỏ hơn 200 nhưng lớn hơn hoặc bằng 100, nên trả về TRUE.
TRUE
x < 200 & x > 100 # điều này là FALSE vì so sánh thứ hai, tức x lớn hơn 100, là false.
FALSE
  • Toán tử OR: Toán tử OR khá giống AND. Tuy nhiên, khác biệt chính là biểu thức OR tổng thể sẽ là TRUE nếu một trong các giá trị lôgic của nó là TRUE.
Bảng chân trị toán tử OR
Bảng chân trị toán tử OR

Let's look at some of the self-explanatory examples.
TRUE | TRUE # 1 + 1 = 1
TRUE
TRUE | FALSE # 1 + 0 = 0
TRUE
FALSE | FALSE # 0 + 0 = 0
FALSE
FALSE | TRUE # 0 + 1 = 0
TRUE

Hãy dùng lại ví dụ số ở trên, nhưng lần này kết quả sẽ khác.

x <- 100
x < 200 | x > 100 # điều này là TRUE vì so sánh thứ nhất, tức x nhỏ hơn 200, là True.
TRUE
  • Toán tử NOT: Đây là toán tử dễ hiểu nhất, chỉ đơn giản phủ định giá trị lôgic mà nó áp dụng vào, hay bạn có thể xem nó là đối lập của giá trị lôgic đó.
Bảng chân trị toán tử NOT
Bảng chân trị toán tử NOT

Hãy xem một vài ví dụ!

a = 1
!a # trả về false vì phủ định của a sẽ là 0 tức FALSE.
FALSE
a = 0
!a #tương tự ví dụ trên, trả về TRUE vì a = 0 và phủ định của a là 1.
TRUE

Hãy xem một số trường hợp toán tử NOT hữu ích khi làm việc với các hàm tích hợp của R.

is.numeric(5) #trả về TRUE vì 5 là số
TRUE
!is.numeric(5) #phủ định của điều trên sẽ trả về FALSE
FALSE
is.numeric('aditya')
FALSE

Ví dụ dưới đây hữu ích khi bạn xử lý dữ liệu trộn giữa số và chuỗi, và bạn muốn lọc bỏ chuỗi/ký tự khỏi, chẳng hạn, một list và chỉ giữ dữ liệu số.

!is.numeric('aditya')
TRUE

Cuối cùng, hãy tìm hiểu cách các toán tử logic hoạt động trên vector và ma trận.

a <- c(FALSE, TRUE, FALSE)
b <- c(TRUE, TRUE, FALSE)
a & b # toán tử AND
  1. FALSE
  2. TRUE
  3. FALSE
a | b # toán tử OR
  1. TRUE
  2. TRUE
  3. FALSE

Dựa trên hai đầu ra trên, rõ ràng là tương tự như vector với toán tử quan hệ, các toán tử logic cũng thực hiện theo từng phần tử.

Tuy nhiên, toán tử NOT chỉ có thể áp dụng trên một vector tại một thời điểm hoặc trên kết quả của hai vector.

!a
  1. TRUE
  2. FALSE
  3. TRUE
!b
  1. FALSE
  2. FALSE
  3. TRUE

Trong ví dụ dưới đây, toán tử NOT ở ngoài ngoặc, nghĩa là nó áp dụng lên kết quả của a và b. Toán tử dưới đây cũng có thể gọi là toán tử NOR (Not-OR).

!(a | b) # toán tử NOR
  1. FALSE
  2. FALSE
  3. TRUE

Trước khi chuyển sang câu lệnh điều kiện, hãy làm một bài tập nhỏ.

Bạn có cùng vector lượt xem hướng dẫn datacamp như đã định nghĩa phía trên. Hãy trích xuất phần tử cuối cùng bằng phương thức tail của R.

last <- tail(datacamp_views,1)
print (last)
[1] 64

Hãy xem phần tử cuối cùng nhỏ hơn 100 hay lớn hơn 100.

last < 100 | last > 100
TRUE

Vì phần tử cuối nhỏ hơn 100, một trong các vế của biểu thức thỏa mãn, nên trả về TRUE.

Hãy chuyển sang chủ đề cuối của hướng dẫn này, tức là câu lệnh điều kiện!

Câu lệnh điều kiện

Đến giờ bạn đã học về toán tử quan hệ, cho bạn biết các R-Object liên hệ với nhau thế nào, và toán tử logic, cho phép bạn kết hợp các giá trị lôgic. R cung cấp cách để bạn kết hợp tất cả các toán tử này và dùng kết quả để thay đổi hành vi của script R. Với điều đó, hãy đi vào câu lệnh if và else.

Cú pháp của điều kiện if được định nghĩa như sau: if(condition){ // expression } Câu lệnh if nhận đầu vào là một điều kiện (bên trong ngoặc tròn) có thể gắn với toán tử quan hệ hoặc lôgic; nếu điều kiện đó TRUE thì đoạn mã R đi kèm điều kiện (bên trong ngoặc nhọn) sẽ được thực thi. Đơn giản, phải không?

Hãy hiểu bằng ví dụ.

Giả sử bạn có biến x bằng -10, giờ bạn đặt điều kiện kiểm tra x có lớn hơn 0 hay không và phủ định điều đó bằng toán tử NOT. Vì điều kiện là TRUE, nên mã R trong ngoặc nhọn sẽ được thực thi.

x <- -10
if (!x > 0){
    print("x is a negative number")
}
[1] "x is a negative number"

Tuy nhiên, nếu bạn bỏ toán tử NOT đi, điều kiện sẽ thành FALSE và mã trong ngoặc nhọn sẽ không được thực thi.

if (x > 0){
    print("x is a positive number")
}

Bây giờ hãy hiểu câu lệnh else qua cú pháp. if(condition){ // expression1 }else{ // expression2 } Không giống if, else không cần điều kiện riêng; nó phải dùng kết hợp với if. Mã R đi kèm else chỉ được thực thi nếu điều kiện của câu lệnh if` không TRUE.

Hãy lấy cùng ví dụ if để hiểu câu lệnh else.

x <- -10
if (x > 0){
    print("x is a positive number")
}else{
    print("x is a negative number")
}
[1] "x is a negative number"

Trong ví dụ trên, vì câu lệnh if không hợp lệ, nên câu lệnh else được thực thi.

Tương tự if và else, bạn có else if nằm giữa if và else. Nó được thực thi khi điều kiện của if không thỏa mãn. Tóm lại, else được ưu tiên cuối cùng. if(condition){ // expression1 }else if(condition){ // expression2 }else{ // expression3 }

x <- 0
if (x > 0){
    print("x is a positive number")
}else if (x == 0){
    print("x is zero")
}else{
    print("x is a negative number")
}
[1] "x is zero"

Chủ yếu, một trong những lý do dùng else if là khi các điều kiện không loại trừ lẫn nhau, nghĩa là có thể xảy ra đồng thời. Hãy xem ví dụ.

x <- 12
if (x %% 3 == 0){
    print("x is divisible by 3")
}else if (x %% 4 == 0){
    print("x is divisible by 4")
}else{
    print("x is neither divisible by 3 nor by 4")
}
[1] "x is divisible by 3"

Trong ví dụ trên, điều kiện if trở thành TRUE, nên R thoát khỏi cấu trúc điều khiển và không vào các câu tiếp theo, dù điều kiện else if cũng sẽ đánh giá là TRUE thì nó vẫn không thực thi. Tuy nhiên, nếu thay else if bằng một câu if khác, thì câu đó cũng sẽ được thực thi.

Kết luận

Chúc mừng bạn đã hoàn thành hướng dẫn.

Hướng dẫn này là điểm khởi đầu tốt cho người mới bắt đầu muốn học ngôn ngữ lập trình R. Như một bài luyện tập, bạn có thể áp dụng các toán tử quan hệ và logic làm điều kiện trong các câu lệnh điều kiện.

Vẫn còn các chủ đề chưa đề cập trong R như Tiện ích trong R và Học máy với R, sẽ được đề cập trong các hướng dẫn tương lai, hãy đón xem!

Vui lòng đặt câu hỏi liên quan đến hướng dẫn này trong phần bình luận bên dưới.

Nếu bạn muốn học thêm về R, hãy học khóa Intermediate R của DataCamp.

Chủ đề

Liên quan