Bắt đầu ngayBắt đầu miễn phí

Dùng && thay cho &

Để xác định xem hai viên xúc xắc có giống nhau không, hàm move_square() dùng các câu lệnh if.

if (is_double[1] & is_double[2] & is_double[3]) {
    current <- 11 # Go To Jail - square 11 == Jail
}

Toán tử & sẽ luôn đánh giá cả hai đối số. Tức là, nếu bạn gõ x & y, R sẽ luôn cố xác định cả xy là gì. Có một số trường hợp như vậy là không hiệu quả. Ví dụ, nếu xFALSE thì x & y luôn là FALSE, bất kể giá trị của y là gì. Vậy nên bạn có thể tiết kiệm một chút thời gian xử lý bằng cách không tính toán nó. Toán tử && tận dụng mẹo này và không thèm tính y nếu điều đó không ảnh hưởng đến kết quả tổng thể.

Trong đoạn mã này, nếu is_double[1]FALSE thì bạn KHÔNG cần đánh giá is_double[2] hay is_double[3], vì thế bạn có thể tăng tốc bằng cách đổi & thành &&.

Cần lưu ý là && chỉ hoạt động với các giá trị logic đơn lẻ, tức là các vector logic có độ dài 1 (như bạn truyền vào điều kiện if), còn & cũng hoạt động với các vector có độ dài lớn hơn 1.

Bài tập này là một phần của khóa học

Viết mã R hiệu quả

Xem khóa học

Hướng dẫn bài tập

  1. Tạo hàm improved_move() tương tự move(), nhưng dùng &&.
  2. Dùng microbenchmark() để so sánh improved_move() với phiên bản trước move().

Bài tập tương tác thực hành trực tiếp

Hãy thử làm bài tập này bằng cách hoàn thành đoạn mã mẫu này.

# Example data
is_double

# Define the previous solution
move <- function(is_double) {
    if (is_double[1] & is_double[2] & is_double[3]) {
        current <- 11 # Go To Jail
    }
}

# Define the improved solution
improved_move <- function(is_double) {
    if (is_double[1] ___ is_double[2] ___ is_double[3]) {
        current <- 11 # Go To Jail
    }
}

# microbenchmark both solutions
# Very occassionally the improved solution is actually a little slower
# This is just random chance
microbenchmark(___, ___, times = 1e5)
Chỉnh sửa và Chạy Mã