Ответ 1
Я думаю, вы ответили на свой вопрос: потому что он рекурсивный.
Вы не часто это видите, но NULL
действительно может использоваться для обозначения пустой последовательности, поскольку это пустой pairlist
(аналогично тому, как ()
в Схеме завершает список. очень схема).
Итак, rapply
повторяется в пустой список, но не позаботится о его возврате в список пар, когда это будет сделано; вы получаете обычный пустой список.
Собственно, rapply
и lapply
не относятся к 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;
}