2011-08-24 103 views
15

我知道列表中的NULL值有時可以由trip人起來。我很好奇爲什麼在一個特定的例子lapplyrapply似乎對待NULL值不同。爲什麼rapply和lapply以不同的方式處理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中所宣稱的那樣,它是'遞歸版本',爲什麼它們在這種情況下表現得如此不同呢?

回答

18

我想你回答了你自己的問題:因爲它是遞歸的。

你不會經常看到這一點,但NULL實際上可以用來表示一個空序列,因爲它是空的pairlist(類似於如何()方案終止的列表。在內部,R是非常像方案)。

因此,rapply遞歸到空列表中,但在完成時不會將其重新轉換爲pairlist;你會得到一個普通的空白列表。

其實,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; 
} 
+1

+1指出'NULL'是一個空的'pairlist'。所以這聽起來像你說'rapply'不能(或不會)區分'NULL'和'pairlist()'。 – joran

+1

@joran'相同(pairlist(),NULL)':) – Owen

相關問題