2011-08-24 17 views
15

मुझे पता है कि सूचियों में नल मूल्य कभी-कभी trip लोग हो सकते हैं। मुझे उत्सुकता है कि एक विशिष्ट उदाहरण में lapply और rapplyNULL मानों का अलग-अलग व्यवहार करते हैं।रैप्ली और लापरवाही क्यों अलग-अलग संभालते हैं?

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 है (कैसे योजना में () एक सूची समाप्त हो जाता है के समान है। आंतरिक रूप से, आर की तरह बहुत स्कीम हो)।

तो, rapply खाली सूची में रिकर्स करता है, लेकिन इसे पूरा होने पर इसे वापस पार्लिस्ट में बदलना परेशान नहीं करता है; आपको नियमित खाली सूची मिलती है।

वास्तव में, rapply और lapply वास्तव में शून्य का इलाज नहीं है कि अलग ढंग से:

> lapply(NULL, identity) 
list() 

और तुम आर स्रोत कोड (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; 
} 
+1

+1 यह इंगित करने के लिए कि 'नूल' खाली 'पार्लिस्ट' है। तो ऐसा लगता है जैसे आप कह रहे हैं कि 'rapply'' NULL' और 'pairlist()' के बीच अंतर नहीं कर सकता (या नहीं)। – joran

+1

@ जोरान 'समान (पार्लिस्ट(), न्यूल) ':) – Owen

संबंधित मुद्दे