为什么Rappy和Lappy处理NULL的方式不同?

为什么Rappy和Lappy处理NULL的方式不同?,r,null,lapply,R,Null,Lapply,我知道列表中的空值有时会让人感到困惑。我很好奇为什么在一个特定的实例中,lappy和rappy似乎对NULL值有不同的处理方式 l <- list(a = 1, c = NULL, d = 3) lapply(l,is.null) $a [1] FALSE $c [1] TRUE $d [1] FALSE 此示例非常简单且非递归,但在嵌套列表的rappy中可以看到相同的行为 我的问题是为什么?如果如《代码》中所宣传的,它是“lappy的递归版本”,那么在这种情况下,它们的行为为何会

我知道列表中的空值有时会让人感到困惑。我很好奇为什么在一个特定的实例中,
lappy
rappy
似乎对
NULL
值有不同的处理方式

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

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

$c
[1] TRUE

$d
[1] FALSE
此示例非常简单且非递归,但在嵌套列表的
rappy
中可以看到相同的行为


我的问题是为什么?如果如《代码》中所宣传的,它是“lappy的递归版本”,那么在这种情况下,它们的行为为何会如此不同?

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

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

因此,
rappy
递归到空列表中,但在完成后不必麻烦将其返回到成对列表中;你会得到一个常规的空列表

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

> lapply(NULL, identity)
list()
您可以在R源代码()中看到,这正是PairList的工作方式:

SEXP allocList(int n)
{
    int i;
    SEXP result;
    result = R_NilValue;
    for (i = 0; i < n; i++)
        result = CONS(R_NilValue, result);
    return result;
}
SEXP allocList(int n)
{
int i;
SEXP结果;
结果=R_值;
对于(i=0;i
+1,用于指出
NULL
是空的
pairlist
。所以听起来你好像在说,
rapply
不能(或不会)区分
NULL
pairlist()
@joran
相同(pairlist(),NULL)
:)
SEXP allocList(int n)
{
    int i;
    SEXP result;
    result = R_NilValue;
    for (i = 0; i < n; i++)
        result = CONS(R_NilValue, result);
    return result;
}