2011-08-25 68 views
37

Sự khác biệt giữa NULL và ký tự (0) | số nguyên (0) vv?Sự khác nhau giữa NULL và ký tự (0) trong R là gì?

> identical(NULL, character(0)) 
[1] FALSE 

> is.null(integer(0)) 
[1] FALSE 

> str(character(0)) 
chr(0) 

> str(NULL) 
NULL 

Nói chung có vẻ như bạn có thể vượt qua NULL như thông số vào chức năng, và rằng một vector rỗng thường trở lại như character(0), integer(0) vv

Tại sao đây là trường hợp? Hãy suy nghĩ về điều đó, có thử nghiệm cho số không, a lais.integer0?

+0

'class (NULL); class (character (0)) ' – isomorphismes

Trả lời

31

Các R Language Definitio n có này trên NULL:

Có một đối tượng đặc biệt gọi là VÔ GIÁ TRỊ. Nó được sử dụng bất cứ khi nào có nhu cầu chỉ định hoặc chỉ định rằng một đối tượng vắng mặt. Không được nhầm lẫn với vectơ hoặc danh sách sốđộ dài. Đối tượng NULL không có loại và không có thuộc tính có thể sửa đổi. Chỉ có một đối tượng NULL trong R, mà tất cả các trường hợp đều tham chiếu. Để kiểm tra sử dụng NULL is.null. Bạn không thể đặt thuộc tính trên NULL.

Vì vậy, theo định nghĩa NULL rất khác với vectơ độ dài bằng không. Một véc tơ có độ dài bằng không rất nhiều không phải là vắng mặt. NULL thực sự là sự bắt giữ tất cả những gì không có hoặc không được thiết lập, nhưng không thiếu, đó là công việc của NA. Có một ngoại lệ, danh sách cặp không độ dài, như đã đề cập bởi @Owen. Định nghĩa Ngôn ngữ cho biết:

Danh sách cặp không có độ dài là NULL, như được mong đợi trong Lisp nhưng ngược lại với danh sách có độ dài bằng 0.

làm nổi bật ngoại lệ trong trường hợp này.

Để kiểm tra vectơ có độ dài bằng không, hãy sử dụng ví dụ như if(length(foo) == 0L). Và kết hợp đó với một kiểm tra lớp học (is.character(foo)) nếu bạn muốn có một loại cụ thể của vector chiều dài bằng không.

+2

Mặc dù xem http://stackoverflow.com/questions/7170264/why-do-rapply-and-lapply-handle-null-differently cho một sự giống nhau đặc biệt. – Owen

+0

Điểm tốt và câu trả lời tuyệt vời. –

+0

@Owen Bạn đúng. Tôi đã nhìn thấy rằng danh sách cặp đôi không phải là vectơ ở tất cả, ngay cả khi họ có chiều dài nonzero. Tôi đã xóa nhận xét của mình để tránh nhầm lẫn thêm. – goodside

7

Dưới đây là một câu trả lời từng phần, bắt đầu bằng cách đơn giản trích dẫn R Hướng dẫn Ngôn ngữ Định nghĩa:

Có một đối tượng đặc biệt gọi là NULL. Nó được sử dụng bất cứ khi nào có cần chỉ định hoặc chỉ định rằng một đối tượng vắng mặt. Không được nhầm lẫn với vectơ hoặc danh sách có độ dài bằng 0. Đối tượng NULL không có loại và không có thuộc tính có thể sửa đổi. Chỉ có một đối tượng NULL trong R, mà tất cả các trường hợp tham chiếu. Để kiểm tra sử dụng NULL is.null. Bạn không thể đặt thuộc tính trên NULL.

Tôi lấy đó để có nghĩa là vectơ không dài có thể có các thuộc tính, trong khi NULL không thể:

> x <- character(0) 
> y <- NULL 
> attr(x,"name") <- "nm" 
> attr(y,"name") <- "nm" 
Error in attr(y, "name") <- "nm" : attempt to set an attribute on NULL 
7

Những người khác có câu trả lời đúng, nhưng tôi muốn thêm một vài sự tò mò.

Đầu tiên, không phải là khá đúng là NULL "được sử dụng bất cứ khi nào có nhu cầu chỉ định hoặc chỉ định rằng đối tượng vắng mặt" như được nói trong tài liệu. Thực tế có 2 giá trị "không có dữ liệu" khác trong R (không tính NA, mà không phải là một giá trị hoàn chỉnh).

Có "mất tích", được sử dụng cho các đối số mất tích:

alist (x =) $ x

> identical(NULL, alist(x=)$x) 
[1] FALSE 
> y = alist(x=)$x 
> y 
Error: argument "y" is missing, with no default 

Sau đó có "không ràng buộc", mà bạn có thể không (AFAIK) truy cập trực tiếp, nhưng sử dụng C:

SEXP getUnbound(void) { 
    return R_UnboundValue; 
} 

> x = .Call("getUnbound") 
> x 
Error: object 'x' not found 
+1

+1 Có lẽ ý nghĩa của chúng là 'NULL' được sử dụng _by user_ cuối để chỉ ra hoặc xác định rằng một đối tượng bị đặt", trong khi R sử dụng những thứ khác trong nội bộ trong một số trường hợp. – joran

+0

@joran Vâng, đó có thể là một cách hay để nói điều đó. – Owen

Các vấn đề liên quan