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