4

我相信这可能是一个错误。如果是这样,我会报告。寻找确认:

> is.null(data.table(NULL))
  [1] FALSE

我在常见问题解答中看到以下内容:

2.5 NULL data.table 和 DT[0] 一样吗?不,尽管打印方法另有说明。严格来说,is.null(data.table(NULL)) 不可能返回 FALSE。将来可能会重新访问此常见问题解答。

如果这是预期的行为:如何检查对象是否为空?特别rbindlist是一个NULL对象返回了一个NULL data.table那么如何检查呢?

> is.null(rbindlist(NULL))
  [1] FALSE
4

2 回答 2

5

我不确定为什么FAQ 是这样表述的。但是,空数据表只是一个空列表:

> data.table:::null.data.table
function () 
{
    ans = list()
    setattr(ans, "class", c("data.table", "data.frame"))
    setattr(ans, "row.names", .set_row_names(0L))
    settruelength(ans, 0L)
    alloc.col(ans)
}

这不是NULL。来自?list

一个空的pairlist,pairlist() 与NULL 相同。这与 list() 不同。

您可以通过查看它的长度是否为 0 ( length(DT) == 0) 来检查它。这是data.table:::print.data.table决定是打印“NULL data.table”还是“Empty data table (0 rows) ...”。

于 2013-03-10T12:15:35.720 回答
4

好点子。现在已经改变了输出data.table(NULL)。来自 v1.8.9 中的新闻:

FAQ 2.5 现在改为:

FAQ 2.5 null data.table 和 DT[0] 一样吗?
不,“null data.table”是指data.table(NULL)or的结果as.data.table(NULL);IE,

> data.table(NULL)
Null data.table (0 rows and 0 cols)
> as.data.table(NULL)
Null data.table (0 rows and 0 cols)
> data.frame(NULL)
data frame with 0 columns and 0 rows
> as.data.frame(NULL)
data frame with 0 columns and 0 rows

null附加了一些属性,使其 不再data.table|frame存在。在 R 中,只有 pure由测试。当提到“null data.table”时,我们使用小写的 null 来帮助区分大写的 NULL。要测试 null data.table,请使用 or (稍快,因为它是一个原始函数)。一个空的 data.table ( ) 有一个或多个列,所有列都是空的。那些空列仍然有名称和类型:NULLNULLNULLNULLis.null()length(DT)==0ncol(DT)==0lengthDT[0]

> DT = data.table(a=1:3,b=c(4,5,6),d=c(7L,8L,9L))
> DT[0]
Empty data.table (0 rows) of 3 cols: a,b,d
> sapply(DT[0],class) 
        a         b         d 
"integer" "numeric" "integer"
于 2013-03-11T10:08:53.533 回答