NULL和字符(0)、integer(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)等的形式返回。
为什么是这种情况?想想看,有没有零度的测试,la is.integer0?
发布于 2011-08-25 18:35:10
R语言定义n在NULL上有这个
有一个名为NULL的特殊对象。每当需要指出或指定一个对象不存在时,就使用它。不应将其与向量或零长度列表混淆。空对象没有类型,也没有可修改的属性。R中只有一个空对象,所有实例都引用该对象。若要测试空值,请使用is.null。不能将属性设置为NULL。
因此,从定义上说,NULL与零长度向量有很大的不同。很大程度上,零长度向量并不是不存在的。NULL实际上是一个陷阱--对于缺少或没有设置,但没有丢失的东西--这是NA的工作。有一个例外,零长度配对列表,如@欧文所提到的。语言定义规定:
零长度对列表是空的,这在Lisp中是预期的,但与零长度列表相反。
这突出了本例中的异常。
要测试零长度向量,可以使用类似于if(length(foo) == 0L)的方法。如果您想要特定类型的零长度向量,则将其与类检查(is.character(foo))结合起来。
发布于 2011-08-25 19:05:21
其他人有正确的答案,但我想补充一些好奇。
首先,在文档中,NULL“在需要指示或指定对象缺失时被使用”的说法并不完全正确。实际上,R中还有另外两个“无数据”值(不包括NA,这不是一个完整的值)。
有“缺失”,用于缺少参数:
作者(x=)$x
> identical(NULL, alist(x=)$x)
[1] FALSE
> y = alist(x=)$x
> y
Error: argument "y" is missing, with no default然后是"unbound",您不能(AFAIK)直接访问它,但是使用C:
SEXP getUnbound(void) {
return R_UnboundValue;
}
> x = .Call("getUnbound")
> x
Error: object 'x' not found发布于 2011-08-25 18:25:20
这里有一个部分的答案,从引用R语言定义指南开始:
有一个名为NULL的特殊对象。每当需要指出或指定一个对象不存在时,就使用它。不应将其与向量或零长度列表混淆。空对象没有类型,也没有可修改的属性。R中只有一个空对象,所有实例都引用该对象。若要测试空值,请使用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 NULLhttps://stackoverflow.com/questions/7195248
复制相似问题