首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在R中,NULL和字符(0)的区别是什么?

在R中,NULL和字符(0)的区别是什么?
EN

Stack Overflow用户
提问于 2011-08-25 18:17:10
回答 3查看 34.4K关注 0票数 47

NULL和字符(0)、integer(0)等有什么区别?

代码语言:javascript
复制
> 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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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))结合起来。

票数 40
EN

Stack Overflow用户

发布于 2011-08-25 19:05:21

其他人有正确的答案,但我想补充一些好奇。

首先,在文档中,NULL“在需要指示或指定对象缺失时被使用”的说法并不完全正确。实际上,R中还有另外两个“无数据”值(不包括NA,这不是一个完整的值)。

有“缺失”,用于缺少参数:

作者(x=)$x

代码语言:javascript
复制
> identical(NULL, alist(x=)$x)
[1] FALSE
> y = alist(x=)$x
> y
Error: argument "y" is missing, with no default

然后是"unbound",您不能(AFAIK)直接访问它,但是使用C:

代码语言:javascript
复制
SEXP getUnbound(void) {
    return R_UnboundValue;
}

> x = .Call("getUnbound")
> x
Error: object 'x' not found
票数 11
EN

Stack Overflow用户

发布于 2011-08-25 18:25:20

这里有一个部分的答案,从引用R语言定义指南开始:

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

我认为这意味着零长度向量可以有属性,而NULL不能:

代码语言:javascript
复制
> 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
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7195248

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档