16

リスト内の 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

ここまでは順調ですね。でまったく同じことをしrapplyたらどうですか?

rapply(l, is.null, how = "replace")
$a
[1] FALSE

$c
list()

$d
[1] FALSE

この例は非常に単純で再帰的ではありませんがrapply、ネストされたリストでも同じ動作が見られます。

私の質問はなぜですか?で宣伝されているように?rapply、それが「lapply の再帰バージョン」である場合、この場合、なぜ動作が異なるのでしょうか?

4

1 に答える 1

20

あなたはあなた自身の質問に答えたと思います:それは再帰的だからです。

これはあまり見られませんが、NULL実際には空のシーケンスを示すために使用できます。これは空であるためですpairlist(Scheme でリストを終了する方法に似て()います。内部的には、R は非常にスキームに似ています)。

したがって、rapply空のリストに再帰しますが、完了時にペアリストに戻す必要はありません。通常の空のリストを取得します。

実際には、実際には NULL をそれほど異なる方法で扱わないrapplyでください:lapply

> 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;
}
于 2011-08-24T04:31:24.243 に答える