2012-11-17 16 views
8

सूची में घोंसले के स्तर को निर्धारित करने के लिए कोई आसान तरीका है (यानी एक समारोह)? मुझे पता है कि str है जिसका उपयोग इस जानकारी को प्राप्त करने के लिए किया जा सकता है। लेकिन क्या ऐसा कुछ है जो परिणाम को वापस देता है? और क्या मैं इस तरह के एक समारोह का उपयोग अलिस्ट के सभी स्तरों (रिकर्सिवली) के नाम प्राप्त करने के लिए कर सकता हूं?आर में घोंसले का स्तर निर्धारित करें?

+1

आप की कोशिश कर सकते 'रों <पैकेज एक बार आधिकारिक क्रैन संस्करण का हिस्सा बन जाएगा - (capture.output (str (mylist, nest.lev = 1)) [- 1]) 'और फिर' ..' की संख्या को कैप्चर करने के लिए स्ट्रिंग प्रोसेसिंग का उपयोग करें जो 's' के प्रत्येक तत्व को प्रारंभ करता है। (अगर मुझे 10 मिनट बाद मिलते हैं और तब तक कोई बेहतर जवाब नहीं मिलता है, तो मैं इसे खुद एक शॉट दूंगा।) –

उत्तर

10

एक छोटी सी पुनरावर्ती क्रिया आप के लिए यह कर सकते हैं:

depth <- function(this,thisdepth=0){ 
    if(!is.list(this)){ 
    return(thisdepth) 
    }else{ 
    return(max(unlist(lapply(this,depth,thisdepth=thisdepth+1))))  
    } 
} 

अगर आपने लोव प्रयोग करने के लिए

l1=list(1,2,3) 
l2=list(1,2,l1,4) 
l3=list(1,l1,l2,5) 

require(testthat) 
expect_equal(depth(l1),1) 
expect_equal(depth(l2),2) 
expect_equal(depth(l3),3) 

क्षमा याचना: package:testthat मिला, यहाँ एक परीक्षण सेट है परिवर्तनीय नामों में आर-केस एल। पठनीयता विफल

+9

+1 - थोड़ा छोटा 'गहराई <होगा - फ़ंक्शन (यह) ifelse (is.list (यह)), 1 एल + अधिकतम (sapply (यह, गहराई)), 0 एल) ' – flodel

+0

बहुत अच्छा समाधान! –

+0

अच्छा सुधार! मेरे परीक्षण पास करता है। आर कोड गोल्फ किसी को भी? – Spacedman

2

सभी तत्वों को नाम दिया गया है, तो आप (unlist के कोड से) इस इस्तेमाल कर सकते हैं:

mylist <- list(a=list(x=1),b=list(c=list(y=c(2,3)),d=c("a","b"))) 
names(.Internal(unlist(mylist, TRUE, TRUE))) 
#[1] "a.x" "b.c.y1" "b.c.y2" "b.d1" "b.d2" 
0

अब आप पैकेज से depth() का उपयोग कर सकते हैं!

नोट: वर्तमान में समारोह purrr के विकास के संस्करण का हिस्सा है लेकिन एक संस्करण टक्कर हो जाता है

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