我知道,在列表中的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递归到空列表中,但是当它完成时,它不会把它变成一个旋转的; 你得到一个常规的空列表.
实际上,rapply并lapply没有真正区别对待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)