【问题标题】:is.null does not work on null data.table in R [possible bug]?is.null 不适用于 R [可能的错误] 中的 null data.table?
【发布时间】:2013-03-10 00:25:55
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    我不知道为什么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 一样。这是不同的 来自列表()。

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

    【讨论】:

    • 谢谢!这就是我最终做的事情.. jsut 检查nrow(DT)==0
    • @Alex length(DT)==0 等同于 ncol(DT)==0 而不是 nrow(DT)==0。
    • 常见问题解答试图说 is.null(data.frame(NULL)) 也是 FALSE 并且由于 is.null 不是 S3 通用的,我们甚至无法为 data.table 更改它如果我们愿意。唯一的 NULL 就是 NULL。
    • 嗯。 data.table(NULL) 打印“NULL data.table”似乎是问题所在,这不是误导。 data frame with 0 columns and 0 rowsdata.frame(NULL) 输出似乎更好。
    【解决方案2】:

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

    FAQ 2.5 现在改为:

    FAQ 2.5 null data.table 是否与 DT[0] 相同?
    不,“null data.table”是指data.table(NULL)as.data.table(NULL) 的结果;即,

    > 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
    

    空的data.table|frameNULL 附加了一些属性,使它不是 NULL 了。在 R 中,只有纯 NULLNULL,由 is.null() 测试。什么时候 提到“null data.table”,我们使用小写的 null 来帮助 区别于大写 NULL。要测试空 data.table,请使用 length(DT)==0ncol(DT)==0 (length 稍微快一些,因为它是 原始函数)。一个空的 data.table (DT[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"
    

    【讨论】:

      猜你喜欢
      • 2016-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-07
      • 2015-11-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多