2016-07-07 11 views
8

मनमाने ढंग से नेस्टेड सूची को देखते हुए, मुझे कैसे पता चलेगा कि सूची में खाली सूचियां हैं या नहीं? निम्न उदाहरण पर विचार करें:सूचियों की नेस्टेड सूची में खाली सूचियां खोजें

mylist <- list(list("foo", "bar", "baz", list(list())))

मैं rapply कोशिश की, लेकिन है कि सूची के माध्यम से छोड़ देता है। जबकि मैं lapply का उपयोग कर सकता था, मुझे पहले से घोंसले के स्तर को जानना होगा। इस अभ्यास के लिए, मुझे यह जानने की आवश्यकता नहीं है कि सूची कहां है (हालांकि यह बोनस होगा), मुझे बस यह पता लगाने का एक तरीका चाहिए कि कोई है या नहीं।

+0

@MrFlick हां, यही वह है जो मैं –

उत्तर

8

क्या इस

has_empty_list <- function(x) { 
    if(is.list(x)) { 
     if (length(x)==0) { 
      return(TRUE) 
     } else { 
      return(any(vapply(x, has_empty_list, logical(1)))) 
     } 
    } else { 
     return(FALSE) 
    } 
} 

मूल रूप से की तरह एक समारोह के बारे में हम एक पुनरावर्ती समारोह बनाने लंबाई 0.

has_empty_list(list(list("foo", "bar", "baz", list(list())))) 
# TRUE 
has_empty_list(list(list("foo", "bar", "baz", list(list(4))))) 
# FALSE 

की सूची देखने के लिए और यहाँ एक संशोधन खाली सूची के सूचकांक ढूँढ़ी जा सकती है

find_empty_list <- function(x, index=c()) { 
    if(is.list(x)) { 
     #list 
     if (length(x)==0) { 
      if (length(index)==0) { 
       return(0) 
      } else { 
       return(index) 
      } 
     } else { 
      m <- Map(find_empty_list, x, lapply(seq_along(x), function(i) append(index,i))) 
      # return the most deeply nested 
      return(m[[which.max(lengths(m))]]) 
     } 
    } else { 
     return(numeric()) 
    } 
} 

यह उस इंडेक्स का वेक्टर वापस कर देना चाहिए जिसका उपयोग आप खाली खोजने के लिए कर सकते हैं सूची। उदाहरण

(i <- find_empty_list(mylist)) 
# [1] 1 4 1 
mylist[[i]] 
# list() 

के लिए तो पहले पैरामीटर ही एक खाली सूची है, यह 0

find_empty_list(list()) 
# 0 

वापस आ जाएगी और अगर कोई खाली सूची है, यह एक खाली वेक्टर

find_empty_list(list(1:3, list("c", a~b))) 
# numeric() 
+1

के बाद हूं, मुझे लगा कि रिकर्सन इसे हल करने का एक अच्छा तरीका होगा। एक मामूली संशोधन - मैं 'vapply (x, has_empty_list, तार्किक (1)) का उपयोग करता हूं। –

+0

@ सेबेस्टियन-सी ने लापता सूची को खोजने के लिए एक और फ़ंक्शन जोड़ा – MrFlick

+0

धन्यवाद @MrFlick। रिक्त सूचियों को ढूंढने वाला एक बहुत अच्छा है, लेकिन खाली सूचियों को ढूंढने वाला एक छोटा सा ट्रिकियर है। ऐसा लगता है कि कई खाली सूचियों में परेशानी है (ऐसा लगता है कि यह सबसे घोंसला वाला है)। –

5
लौटना चाहिए

नेस्टेड सूची के साथ काम करने का एक और सुविधाजनक विकल्प data.tree पैकेज का उपयोग करना है:

library(data.tree) 
nodes <- as.Node(mylist) 
any(node$Get(function(node) length(as.list(node))) == 0) 
# [1] TRUE 
+0

के साथ काफी धीमी लगती है। – Triamus

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