2011-08-25 18 views
37

Jaka jest różnica między NULL a charakterem (0) | liczba całkowita (0) itp.?Jaka jest różnica między wartością NULL i znakiem (0) w R?

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

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

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

> str(NULL) 
NULL 

W ogóle wydaje się, można przekazać NULL jako parametrów do funkcji, i że generalnie jest pusty wektor zwrócony jako character(0), integer(0) itp

Dlaczego tak się dzieje? Pomyśl o tym, czy istnieje test na zero-ności, a lais.integer0?

+0

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

Odpowiedz

31

R Language Definitio n ma to na NULL:

Istnieje specjalny obiekt nazywany ZERO. Jest używany, gdy istnieje potrzeba wskazania lub oznaczenia, że ​​obiekt jest nieobecny. Nie należy jej mylić z wektorem lub listą o długości zero zero. Obiekt NULL nie ma typu i nie można go modyfikować. W R znajduje się tylko jeden obiekt NULL , do którego odnoszą się wszystkie wystąpienia. Aby przetestować NULL, użyj is.null. Nie można ustawić atrybutów na wartość NULL.

Tak więc z definicji NULL jest bardzo różny od wektorów o zerowej długości. Wektor o zerowej długości bardzo ważny nie jest nieobecny. NULL to naprawdę chwyt dla czegoś, co jest nieobecne lub nie ustawione, ale nie brakujące, co jest zadaniem NA. Istnieje wyjątek, para o zerowej długości, jak wspomina @Owen. Definicja języka:

Para o zerowej długości jest NULL, jak można się było spodziewać w Lisp, ale w przeciwieństwie do listy o zerowej długości.

podświetla wyjątek w tym przypadku.

Aby przetestować wektor o zerowej długości, użyj na przykład czegoś podobnego do if(length(foo) == 0L). Połącz to z klasą (is.character(foo)), jeśli chcesz mieć określony typ wektora o zerowej długości.

+2

Mimo, że widzisz http://stackoverflow.com/questions/7170264/why-do-rapply-and-lapply-handle-null-różnie dla szczególnego podobieństwa. – Owen

+0

Dobra i dobra odpowiedź. –

+0

@Owen Masz rację. Przegapiłem, że pary nie są wektorami, nawet jeśli mają niezerową długość. Usunąłem swój komentarz, aby uniknąć dodatkowego zamieszania. – goodside

7

Oto częściowy odpowiedź, zaczynając po prostu podając R języka definicji Guide:

Istnieje specjalny przedmiot o nazwie NULL. Jest używany wszędzie tam, gdzie istnieje potrzeba wskazania lub określenia, że ​​obiekt jest nieobecny. Nie należy go mylić z wektorem lub listą o zerowej długości. Obiekt NULL nie ma typu ani żadnych modyfikowalnych właściwości. W R, znajduje się tylko jeden obiekt NULL, do którego odnoszą się wszystkie wystąpienia. Aby przetestować NULL, użyj is.null. Nie można ustawić atrybutów na NULL na .

biorę to oznaczać, że wektory zerowej długości mogą mieć atrybuty, natomiast NULL nie może:

> 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

Inni faceci mają właściwe odpowiedzi, ale chcę dodać kilka ciekawostek.

Po pierwsze, nie jest to całkiem prawda, że ​​NULL "jest używany, gdy istnieje potrzeba wskazania lub określenia, że ​​obiekt jest nieobecny", jak to jest napisane w dokumencie. W rzeczywistości są 2 inne wartości "brak danych" w R (nie licząc NA, która nie jest kompletną wartością).

Jest "brakuje", który służy do brakujących argumentów:

alist (x =) $ x

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

Potem jest "Bez ograniczeń", która nie może (AFAIK) dostęp bezpośrednio, ale przy użyciu C:

SEXP getUnbound(void) { 
    return R_UnboundValue; 
} 

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

+1 Być może chodzi o to, że 'NULL' jest używany _do użytkownika końcowego_, aby wskazać lub określić, że obiekt jest nieosiowy", podczas gdy R używa w innych przypadkach wewnętrznych rzeczy. – joran

+0

@joran Tak, to chyba dobry sposób na powiedzenie tego. – Owen

Powiązane problemy