2011-08-25 97 views
37

NULL與字符(0)有什麼區別|整數(0)等?R中的NULL和字符(0)有什麼區別?

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

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

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

> str(NULL) 
NULL 

總體看來你可以通過NULL作爲參數成函數和一個空的載體通常返回character(0)integer(0)

爲什麼會出現這種情況?想想吧,是否有零度測試,a lais.integer0

+0

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

回答

31

R Language Definitio n具有這樣的NULL

有一個叫特殊對象空值。每當有需要指示或指定一個對象不存在時使用它。它不應該與長度爲零的向量或列表混淆。 NULL對象沒有類型,也沒有可修改的屬性。 R中只有一個NULL 對象,所有實例都參考該對象。要測試NULL,使用is.null。您無法在NULL上設置 屬性。

所以根據定義NULL與零長度向量非常不同。非常多的零長度矢量不是不存在。 NULL對於沒有或沒有設置的東西來說確實是一件容易事,但不是缺失,這是NA的工作。有一個例外,就是@Owen提到的零長度pairlist。語言定義狀態如下:

零長度pairlist爲NULL,正如在Lisp中預期的那樣,但與零長度列表相反。

在這種情況下突出顯示異常。

爲了測試一個零長度的矢量,例如使用if(length(foo) == 0L)。如果需要特定類型的零長度矢量,請將其與類別檢查(is.character(foo))結合使用。

+2

儘管參見http://stackoverflow.com/questions/7170264/why-do-rapply-and-lapply-handle-null-differently爲一個特殊的相似性。 – Owen

+0

好點和很好的答案。 –

+0

@Owen你是對的。我忽略了,即使長度不是零,pairsists也不是矢量。我刪除了我的評論,以避免任何額外的混淆。 – goodside

7

這裏的部分答案,通過簡單地引用R語言定義指南開始:

有一個叫NULL的特殊對象。每當需要指示或指定對象不存在時,它都會使用。它不應該是 與向量或零長度列表混淆。 NULL對象沒有 類型,也沒有可修改的屬性。 R中只有一個NULL對象,所有實例引用的對象爲 。要測試NULL,使用is.null。您不能在 上設置NULL屬性。

我認爲這意味着該零長度向量可以有屬性,而NULL不能:

> 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

其他人有正確的答案,但我想增加一些好奇心。

首先,它不是相當確實如果需要指示或指定一個對象不存在,則使用NULL「,正如它在文檔中所述。 R中實際上有2個「無數據」值(不包括NA,這不是一個完整的值)。

有 「失蹤」,它用於缺少參數:

ALIST(X =)$ X

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

再有就是 「綁定」,你不能( AFAIK)直接訪問,但使用C:

SEXP getUnbound(void) { 
    return R_UnboundValue; 
} 

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

+1也許他們的意思是'NULL''用於_最終用戶_指示或指定一個對象被abset「,而R在某些情況下使用其他東西。 – joran

+0

@joran是的,這可能是一個很好的說法。 – Owen

相關問題