R中的NULL和字符(0)有什么区别?

时间:2011-08-25 18:17:11

标签: r null

NULL和字符(0)之间有什么区别?整数(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 la is.integer0

3 个答案:

答案 0 :(得分:33)

R Language Definitio n在NULL上有此内容:

  

有一个名为NULL的特殊对象。只要需要指示或,就会使用它   指定一个对象不存在。它不应与向量或零列表混淆   长度。 NULL对象没有类型,也没有可修改的属性。只有一个NULL   R中的对象,所有实例都引用该对象。要测试NULL,请使用is.null。你不能设置   NULL上的属性。

因此,根据定义,NULL与零长度向量非常不同。非常的零长度矢量不存在NULL对于缺少或未设置的东西来说真的是一个全能,但不是缺失,这是NA的工作。正如@Owen所提到的,有一个例外,零长度的旋风。语言定义指出:

  

零长度的pairlist是NULL,正如在Lisp中所期望的那样,但与零长度列表相反。

在这种情况下突出显示异常。

要测试零长度向量,请使用if(length(foo) == 0L)之类的内容。如果你想要一个特定类型的零长度向量,可以将它与类检查(is.character(foo))结合起来。

答案 1 :(得分:8)

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

首先,当需要指示或指定某个对象不存在时,使用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

答案 2 :(得分: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