为什么rapply和lapply处理NULL不同?

jor*_*ran 16 null r lapply

我知道,在列表中的NULL值有时会绊倒人组成.我很好奇为什么在特定的情况下lapply,rapply似乎以NULL不同的方式对待价值观.

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

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

$c
[1] TRUE

$d
[1] FALSE
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.如果我们做同样的事情rapply怎么样?

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

$c
list()

$d
[1] FALSE
Run Code Online (Sandbox Code Playgroud)

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

我的问题是为什么?如果广告中?rapply提到它是"lapply的递归版本",为什么它们在这种情况下表现得如此不同?

Owe*_*wen 20

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

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

所以,rapply递归到空列表中,但是当它完成时,它不会把它变成一个旋转的; 你得到一个常规的空列表.

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

> lapply(NULL, identity)
list()
Run Code Online (Sandbox Code Playgroud)

你可以在R源代码(memory.c)中看到,这正是pairlists的工作方式:

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