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
?
答案 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