2011-08-25 104 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

相关问题