Ở phút 15:33 trong bài LOGICAL VECTOR https://www.tuhocr.com/r-courses/coding-in-r thì mình có test cách hoạt động của toán tử logic AND 1 dấu & so với 2 dấu &&, tương tự cho toán tử logic OR 1 dấu | so với 2 dấu ||, tuy nhiên hiện tại có một số thay đổi như sau.

x <- c(2, 4, 6, 7, 11, 3, 15)

y <- c(2, 2, 6, 7, 10, 3, 15)

Hoạt động OK

x & y
## [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE
x | y
## [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE

Hoạt động KHÔNG ĐƯỢC

x && y
## Error in x && y: 'length = 7' in coercion to 'logical(1)'
x || y
## Error in x || y: 'length = 7' in coercion to 'logical(1)'

Nguyên nhân là toán tử logic với 2 dấu && (AND) và 2 dấu || (OR) chỉ dùng để so sánh giữa hai vector đơn (tức là hai vector có chiều dài là 1, chỉ chứa 1 thành phần). Đây là update từ phiên bản R 4.3.0. Việc này giúp đảm bảo tính chặt chẽ của các lệnh logic. Cụ thể là:

https://cran.r-project.org/doc/manuals/r-release/NEWS.html

a <- 3

b <- 5

c <- c(2, 5, 9, 11)
a & b # thực hiện bình thường
## [1] TRUE
a && b # thực hiện bình thường, việc dùng 2 dấu && giúp nhấn mạnh là đang AND giữa 2 vector đơn
## [1] TRUE
a & c # thực hiện bình thường, giữa vector đơn và vector nhiều thành phần
## [1] TRUE TRUE TRUE TRUE
a && c # không thực hiện được! vì việc dùng 2 dấu && chỉ thực hiện được giữa 2 vector đơn
## Error in a && c: 'length = 4' in coercion to 'logical(1)'
a | b # thực hiện bình thường
## [1] TRUE
a || b # thực hiện bình thường, việc dùng 2 dấu || giúp nhấn mạnh là đang OR giữa 2 vector đơn
## [1] TRUE
a | c # thực hiện bình thường, giữa vector đơn và vector nhiều thành phần
## [1] TRUE TRUE TRUE TRUE
a || c # thực hiện bình thường! dù giữa vector đơn và vector nhiều thành phần!
## [1] TRUE

Khi nào sử dụng toán tử logic theo kiểu 1 dấu & hay là kiểu 2 dấu &&?

Thực tế là nếu bạn dùng toán tử logic kiểu 1 dấu & hay | là áp dụng được cho tất cả các trường hợp thực hiện so sánh logical trong R. Còn nếu muốn kỹ hơn trong lệnh if-else vốn nghiêm ngặt yêu cầu chỉ có 1 kết quả TRUE hay FALSE thì cần dùng toán tử logic kiểu 2 dấu && hay || để đảm bảo quá trình so sánh được chặt chẽ.

& and && indicate logical AND and | and || indicate logical OR.

The shorter forms performs elementwise comparisons in much the same way as arithmetic operators.

The longer forms evaluates left to right, proceeding only until the result is determined.

The longer form is appropriate for programming control-flow and typically preferred in if clauses.

Using vectors of more than one element in && or || will give an error.