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ả x và y là gì. Có một số trường hợp như vậy là không hiệu quả. Ví dụ, nếu x là FALSE 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] là 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ả
Hướng dẫn bài tập
- Tạo hàm
improved_move()tương tựmove(), nhưng dùng&&. - Dùng
microbenchmark()để so sánhimproved_move()với phiên bản trướcmove().
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)