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

And*_*rie 42 null r

NULL和字符(0)|之间有什么区别 整数(0)等?

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

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

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

> str(NULL)
 NULL
Run Code Online (Sandbox Code Playgroud)

一般来说,似乎你可以通过NULL为参数输入功能,以及一个空的载体通常是返回character(0),integer(0)等等.

为什么会这样?想想看,有没有测试过零,一个la is.integer0?

Rei*_*son 35

在R语言Definitio n具有这样的NULL:

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

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

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

这突出了这种情况下的例外情况.

要测试零长度矢量,请使用类似if(length(foo) == 0L)的例子.is.character(foo)如果你想要一个特定类型的零长度向量,并将它与类check()结合起来.

  • 虽然可以看到http://stackoverflow.com/questions/7170264/why-do-rapply-and-lapply-handle-null-differently以获得特殊的相似性. (2认同)

Owe*_*wen 9

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

首先,正如文档中所述,当需要指示或指定某个对象不存在时,使用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
Run Code Online (Sandbox Code Playgroud)

然后是"未绑定",你不能直接访问(AFAIK),但使用C:

SEXP getUnbound(void) {
    return R_UnboundValue;
}

> x = .Call("getUnbound")
> x
Error: object 'x' not found
Run Code Online (Sandbox Code Playgroud)


jor*_*ran 8

这是一个部分答案,首先简单引用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
Run Code Online (Sandbox Code Playgroud)