为什么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;
}