【问题标题】:Why do rapply and lapply handle NULL differently?为什么 rapply 和 lapply 处理 NULL 的方式不同?
【发布时间】:2011-08-24 03:57:53
【问题描述】:

我知道列表中的 NULL 值有时可以trip 人。我很好奇为什么在特定情况下lapplyrapply 似乎对待NULL 值不同。

l <- list(a = 1, c = NULL, d = 3)

lapply(l,is.null)
$a
[1] FALSE

$c
[1] TRUE

$d
[1] FALSE

到目前为止一切顺利。如果我们对rapply 做同样的事情怎么样?

rapply(l, is.null, how = "replace")
$a
[1] FALSE

$c
list()

$d
[1] FALSE

此示例非常简单且非递归,但您会在 rapply 中看到与嵌套列表相同的行为。

我的问题是为什么?如果正如?rapply 中所宣传的那样,它是“lapply 的递归版本”,为什么在这种情况下它们的行为如此不同?

【问题讨论】:

    标签: r null lapply


    【解决方案1】:

    我想你回答了你自己的问题:因为它是递归的。

    你不经常看到这个,但是NULL实际上可以用来表示一个空序列,因为它是空的pairlist(类似于Scheme中()如何终止一个列表。在内部,R是非常像)。

    所以,rapply 会递归到空列表中,但完成后不会费心将其转回配对列表;你会得到一个普通的空列表。

    实际上,rapplylapply 并没有真正区别对待 NULL:

    > lapply(NULL, identity)
    list()
    

    您可以在 R 源代码 (memory.c) 中看到这正是配对列表的工作原理:

    SEXP allocList(int n)
    {
        int i;
        SEXP result;
        result = R_NilValue;
        for (i = 0; i < n; i++)
            result = CONS(R_NilValue, result);
        return result;
    }
    

    【讨论】:

    • +1 指出NULL 是一个空的pairlist。所以听起来你在说rapply 不能(或不会)区分NULLpairlist()
    • @joran identical(pairlist(), NULL) :)
    猜你喜欢
    • 2014-06-02
    • 2016-02-15
    • 1970-01-01
    • 1970-01-01
    • 2020-03-11
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    • 2015-01-04
    相关资源
    最近更新 更多