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()结合起来.
其他人有正确的答案,但我想添加一些好奇心.
首先,正如文档中所述,当需要指示或指定某个对象不存在时,使用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)
这是一个部分答案,首先简单引用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)
| 归档时间: |
|
| 查看次数: |
27522 次 |
| 最近记录: |