gpt4 book ai didi

r - 为什么 rapply 和 lapply 处理 NULL 的方式不同?

转载 作者:行者123 更新时间:2023-12-03 14:50:44 26 4
gpt4 key购买 nike

我知道列表中的 NULL 值有时会 trip人起来。我很好奇为什么在特定情况下 lapplyrapply好像对待NULL值(value)观不同。

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 的“递归版本”,为什么在这种情况下它们的行为如此不同?

最佳答案

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

你不经常看到这个,但是 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;
}

关于r - 为什么 rapply 和 lapply 处理 NULL 的方式不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7170264/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com