Những cái ngắn hơn được vector hóa, có nghĩa là chúng có thể trả về một vectơ, như thế này:
((-2:2) >= 0) & ((-2:2) <= 0)
# [1] FALSE FALSE TRUE FALSE FALSE
Biểu mẫu dài hơn đánh giá từ trái sang phải chỉ kiểm tra phần tử đầu tiên của mỗi vectơ, do đó, phần trên cho
((-2:2) >= 0) && ((-2:2) <= 0)
# [1] FALSE
Như trang trợ giúp nói, điều này làm cho dạng dài hơn "thích hợp cho luồng điều khiển lập trình và [được] thường được ưu tiên trong các mệnh đề."
Vì vậy, bạn muốn sử dụng các hình thức dài chỉ khi bạn chắc chắn các vectơ có độ dài một.
Bạn nên tuyệt đối chắc chắn các vectơ của bạn chỉ có độ dài 1, chẳng hạn như trong trường hợp chúng là các hàm chỉ trả về độ dài 1 booleans. Bạn muốn sử dụng các hình thức ngắn nếu các vectơ có thể dài> 1. Vì vậy, nếu bạn không hoàn toàn chắc chắn, bạn nên kiểm tra trước hoặc sử dụng biểu mẫu ngắn rồi sử dụng all
và any
giảm nó xuống độ dài để sử dụng trong các câu lệnh điều khiển, như if
.
Các hàm all
và any
thường được sử dụng trên kết quả của phép so sánh véc tơ để xem liệu tất cả hoặc bất kỳ phép so sánh nào là đúng, tương ứng. Các kết quả từ các hàm này chắc chắn có độ dài 1 vì vậy chúng phù hợp để sử dụng trong các mệnh đề, trong khi các kết quả từ so sánh véc tơ thì không. (Mặc dù những kết quả đó sẽ thích hợp để sử dụng trong ifelse
.
Một điểm khác biệt cuối cùng: &&
và ||
chỉ đánh giá bao nhiêu thuật ngữ mà họ cần (dường như đó là ý nghĩa của ngắn mạch). Ví dụ: đây là một so sánh sử dụng một giá trị không xác định a
; nếu nó không bị đoản mạch, vì &
và |
không, nó sẽ báo lỗi.
a
# Error: object 'a' not found
TRUE || a
# [1] TRUE
FALSE && a
# [1] FALSE
TRUE | a
# Error: object 'a' not found
FALSE & a
# Error: object 'a' not found
Cuối cùng, xem phần 8.2.17 trong The R Inferno , có tiêu đề "and andand".