2012-08-14 8 views
5

मैं आर में एक संकेत-प्रसार एल्गोरिथ्म पर काम कर रहा हूँ, igraph (यादृच्छिक रेखांकन के लिए एक पुस्तकालय) जो एक 2- के साथ काम करना शामिल है का उपयोग करते हुए स्तर नेस्टेड सूची।Iteratively से और कुशलता से आर igraph में कोने की एक सूची विशेषता के तत्वों को जोड़ने

इग्राफ गुणों (ग्राफ के नोड्स) को गुण संलग्न करने की अनुमति देता है, ये वेक्टर या सूचियां हो सकते हैं, लेकिन मेरे आवेदन में मुझे नेस्टेड सूचियों की आवश्यकता है।

देखने के लिए, की कोशिश:

library("igraph") 
g <- graph.full(10) # create a fully connected graph with 10 vertices 
V(g)$letters <- list(NULL) # adds a list called "letters" to every vertex 
V(g)$letters # results in a nested list 

मैं विभिन्न चरणों में, जोड़ना चाहते हैं, 2-स्तरीय सूचियां की दी गई सबसेट है, जहां subsetted सूची में एक सदिश में संग्रहीत कुछ पूर्व निर्धारित तत्वों वेक्टर के समान आकार है।

समस्या दूसरी स्तर की सूचियों में तत्व जोड़ने के लिए एक प्रभावी तरीका खोजने के लिए है।

set.seed(1234) 

# every iteration represents a "round" of element addition , 
# followed by other operations. 
# So the attribute "letters" should not be populated in one sitting. 
for (i in 1:10){ 

    # select randomly five 2nd-level lists (vertices) from the 1st-level list 
    # the selected vertices are generated randomly for exposition, 
    # but I need to be able to select them from a well-defined vector (sel.ver) 

    sel.vert <- sample(1:10, 5) 

    # generate elements to add to the lists in the 2nd-level list (vertices) 
    # again, i generate them randomly just to fill the vector, 
    #but the vector could be pre-determined 

    add.elem <- sample(letters, 5) 

    # now add add each element to its own list 
    # notice that the first ELEMENT of add.elem (add.elem[1]) is added 
    # to the attribute of the first SELECTED vertex (V(g)[sel.vert[1]]$letters, 
    # the second element of add.elem with the second SELECTED vertex, and so on.. 

    for (l in 1:5){ 
    V(g)[sel.vert[l]]$letters <- list(c(V(g)[sel.vert[l]]$letters, add.elem[l]))  
    } 
} 

(मैं अनुभवी पाठक के लिए माफी माँगता हूँ अगर यह बुरा प्रोग्रामिंग प्रथाओं का एक हॉरर शो था)

:

सरल (और अब तक केवल) रास्ते जाने के लिए एक पाश लिखने के लिए है चूंकि प्रारंभिक नेटवर्क का आकार बड़ा होता है और प्रत्येक पुनरावृत्ति (5 के बजाय एक यादृच्छिक संख्या) पर अधिक से अधिक शिखर चुने जाते हैं, तो लूप बहुत धीमे हो जाते हैं। यह एक "वर्कहोर" समारोह होना चाहिए, इसलिए मैं इसे तेज करना चाहता हूं।

मैं जवाब "Efficiently adding or removing elements to a vector or list in R?" के लिए दिया पढ़ा, अर्थात्, वैक्टर जब भी संभव हो और उनके आकार preallocating के साथ काम करने के लिए, लेकिन मुझे लगता है कि मेरे मामले पर लागू नहीं होता, क्योंकि:

  1. मैं के साथ कि लगता है igraph मेरे पास दूसरी स्तर पर सूचियों (कम से कम पहले स्तर पर)
  2. का उपयोग करने के अलावा कोई विकल्प नहीं है, सूचियों को यादृच्छिक रूप से चुने गए आधार पर अलग-अलग अंतिम लंबाई होगी। तो, सही आकार के वेक्टर को प्रीलाकेट करना मुश्किल है। यहां तक ​​कि अगर मैंने दूसरे स्तर पर बहुत बड़े वैक्टर लगाए, शुरुआत में एनएएस (जिसके परिणामस्वरूप वेक्टरों की एक सूची में) भर गया, तो मुझे पता नहीं चलेगा कि तत्वों को जोड़ने की स्थिति (क्योंकि किसी भी पुनरावृत्ति पर सूची की लंबाई यादृच्छिक है) उल्लेख नहीं है कि मुझे बाद में एनएएस को हटाने की आवश्यकता होगी।

यह तत्वों को जोड़ने (नेस्टेड सूची) के साथ जोड़ने का एक विशेष मामला होना चाहिए। जैसे, मुझे लगता है कि हो सकता है एक तेजी से कार्यान्वयन plyr या do.call में ddply के साथ आंतरिक पाश की जगह द्वारा प्राप्त किया जा सकता है लगता होगा, लेकिन मैं समारोह लिखने के लिए लागू करने के लिए प्रबंधन नहीं कर सके: get the elements of the (inner) list and add this new element (itself a subset of a vector)

कोई भी टिप्पणी या सुझाव इसकी प्रंशसा की जाती है। उम्मीद है कि पद स्पष्ट है।

+1

आप प्रत्येक यात्रा पर 'g' पर कुछ' igraph' कार्रवाई करने की जरूरत है (यानी, 'वी (छ) $ letters' को आबाद करने के अलावा कुछ करते हैं), या यह पॉप्युलेट करने के लिए ठीक है सब' वी (जी) $ अक्षरों का डेटा पहले? – lockedoff

+0

मैं एक दौर के जोड़ों और दूसरे के बीच अन्य परिचालन करता हूं, इसलिए मैं एक बैठे में नेस्टेड सूचियों को पॉप्युलेट नहीं कर सकता। लूप थोड़ा अस्पष्ट है, लेकिन मुझे यह स्पष्ट करने की आवश्यकता है कि शिखर के गुण परत द्वारा परत को आबादी वाले हैं।गलतफहमी के लिए खेद है। – MatteoS

उत्तर

2
# number of vertices to add elements to at a time 
nv <- 5 

# selected vertices and elements 
sel.ver <- sample(V(g), nv) 
add.elem <- sample(letters, nv) 

V(g)$letters[sel.ver] <- lapply(1:nv, function(x) { 
    c(add.elem[x], unlist(V(g)$letters[sel.ver[x]])) 
}) 
+0

धन्यवाद, लेकिन यह वही नहीं है जो मैं ढूंढ रहा था। मुझे खेद है कि यह स्पष्ट नहीं था, लेकिन मैं एक ऐसे फ़ंक्शन की तलाश में हूं जो * * जोड़ों * को आंतरिक सूची में जोड़ता है, * मौजूदा * के अलावा *। यदि मैं आपके फ़ंक्शन को दो बार चलाता हूं, तो दूसरी पुनरावृत्ति की सामग्री * पहले में से एक को बदल देती है। वैसे भी, ddply कथन एक अच्छा प्रारंभिक बिंदु है। क्या आपको लगता है कि मुझे प्रश्न स्पष्ट करने की आवश्यकता है? – MatteoS

+0

मुझे लगता है कि मैं उनका अनुसरण करता हूं, मेरा संपादन देखता हूं, आप बस लापरवाही के भीतर असाइन करने के बजाय गठबंधन कर सकते हैं। – Andy

+0

हां, मैंने देखा (और उल्लेख किया है) कि मैं विशेषताओं के लिए सूचियों के विपरीत वैक्टर असाइन कर सकता हूं। हालांकि, चूंकि अक्षरों की अंतिम संख्या प्रत्येक चरम (सीएफ। प्रश्न और संबंधित बिंदुओं में मेरा कोड) के लिए अलग होगी, मुझे लगता है कि एक सूची जाने का रास्ता है, लेकिन मैं wronf हो सकता है। – MatteoS

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