2017-06-27 29 views
7

Tại sao làSo sánh giá trị với giá trị rỗng. Tại sao điều này đúng?

isTRUE(NULL != 2) 
[1] FALSE 

Và làm cách nào tôi nhận được TRUE?

Trong trường hợp thực sự của tôi, tôi có các biến và tôi muốn xử lý một cái gì đó, nếu các giá trị khác nhau. Tuy nhiên, khi một giá trị là NULL, tôi không nhận ra chúng là khác nhau!

+8

Bạn không thể so sánh với NULL. Bạn cần is.null để kiểm tra nếu một cái gì đó là một tham chiếu đến đối tượng NULL. – Roland

+0

Để lấy giá trị bạn mong đợi, bạn sẽ: 'isTRUE (! Is.null (2))' –

+0

@CarlesMitjans biến không phải lúc nào cũng NULL, thông thường nó có giá trị số nguyên khác. Nó chỉ hiếm khi nó có NULL. Đó là bất tiện, nhưng tôi đã thêm một is.null() kiểm tra trước. Mặc dù vậy tôi không hiểu. Các ngôn ngữ khác làm tốt ở đây. – agoldev

Trả lời

10

Khi @Roland chỉ ra, chúng tôi không thể thực hiện bất kỳ thao tác lôgic nào trực tiếp trên đối tượng NULL. Để so sánh chúng, chúng tôi có thể cần thực hiện kiểm tra bổ sung is.null và sau đó thực hiện so sánh lôgic.

Chúng tôi có thể sử dụng identical để so sánh các giá trị xử lý số nguyên cũng như NULL.

identical(4, 2) 
#FALSE 

identical(NULL, 2) 
#FALSE 

identical(2, 2) 
#TRUE 
0

Để trả lời phần tại sao câu hỏi của bạn:

So sánh NULL với các loại khác sẽ cung cấp cho bạn logical(0) (ví dụ: một vector logic có độ dài bằng không). Vì vậy,

isTRUE(NULL != 2) 

thực sự là

isTRUE(logical(0)) 

đó là FALSE.

Để so sánh các giá trị mà bạn có thể có giá trị NULL cũng có, bạn cũng có thể làm điều gì đó như thế này (sử dụng toán tử logic ngắn mạch):

a <- 2 
b <- 2 
!is.null(a) && !is.null(b) && a==b 
#[1] TRUE 

a <- 3 
b <- 2 
!is.null(a) && !is.null(b) && a==b 
#[1] FALSE 

a <- 2 
b <- NULL 
!is.null(a) && !is.null(b) && a==b 
#[1] FALSE 
Các vấn đề liên quan