2010-06-22 11 views
5

मैं वस्तुओं है कि मैं मैन्युअल रूप से बना लिया है की एक सूची है वस्तुओं में तब्दील सूची आइटम, इस तरह:आर:

rand1 <- rnorm(1e3) 
rand2 <- rnorm(1e6) 

myObjects <- NULL 
myObjects[[1]] <-rand1 
myObjects[[2]] <-rand2 
names(myObjects) <- c("rand1","rand2") 

मैं कुछ कोड है कि वस्तुओं को बंडल करके उन्हें डालता S3 में पर काम कर रहा हूँ । तब मेरे पास ईसी 2 में कोड है कि मैं myObjects सूची को पकड़ना चाहता हूं और इसे स्वचालित रूप से 'अनबंडल' करना चाहता हूं। इस उदाहरण में सूची में केवल दो ऑब्जेक्ट हैं और नाम ज्ञात हैं, लेकिन मैं इसे किसी भी लंबाई और किसी भी नाम की सूचियों को संभालने के लिए कैसे कोड करूं?

#pseudo code 
for each thing in myObjects 
    thing <- myObjects[[thing]] 

मैं यह समझ नहीं कर सकते कि कैसे नाम (myObjects) लेने के लिए [1] और यह एक वस्तु है जिसके लिए मैं myObjects की सामग्री [[1]] आवंटित करेगा के नाम में बदल जाते हैं। मैं लूपिंग को संभाल सकता हूं लेकिन प्रत्येक ऑब्जेक्ट को बनाने के लिए मुझे लटका दिया है। मुझे यकीन है कि यह काफी सरल है, लेकिन मैं इसे काफी परेशान नहीं कर सकता।

+0

संबंधित: http: // ढेर overflow.com/questions/2590043/creating-a-series-of-vectors-from-a-vector, http://stackoverflow.com/questions/2679193/how-to-name-variables-on-the-fly- इन-आर, http://stackoverflow.com/questions/2899581/assign-subset-of-parent-table-to-objects-in-r, http://stackoverflow.com/questions/2907896/how-to- असाइन-टू-द-नेम-एट्रिब्यूट-ऑफ-द-वैल्यू-ऑफ-ए-वेरिएबल-इन-आर – Marek

+1

मैरेक लिंक के लिए धन्यवाद। यह खोज के लिए एक प्रकार का 'कोने समाधान' बन जाता है। एक बार जब मैं उस कार्य को जानता हूं जो मैं चाहता हूं, तो संबंधित प्रश्नों को ढूंढना इतना आसान है। वास्तव में मुश्किल बात यह पता लग रही है कि समस्या के केवल एक संक्षिप्त विवरण के साथ वहां कैसे पहुंचे! –

उत्तर

10

आप assign उपयोग कर सकते हैं:

for(i in 1:length(myObjects)) assign(names(myObjects)[i], myObjects[[i]]) 
+0

असाइन करें() ... वह टुकड़ा है जिसे मैं याद कर रहा था! सही दिशा में मुझे इंगित करने के लिए आप और रिची दोनों के लिए धन्यवाद। –

+3

'seq_along (myObjects) 'थोड़ा सा सुरक्षित है यदि' लंबाई (myObjects) == 0' – hadley

+0

@ हैडली: धन्यवाद! seq_along() एक महान खोज है। निम्न उदाहरणों में से: खराब = 'के लिए (i में 1: लंबाई (NULL)) प्रिंट (i)', good = 'के लिए (i seq_along (NULL) में) प्रिंट (i)' – Shane

5

शेन के जवाब का विस्तार करने के लिए:

mapply(assign, names(myObjects), myObjects, MoreArgs=list(envir = globalenv()) 

(आप एक और पर्यावरण के लिए globalenv() में परिवर्तन करना चाहते हो सकता है।)

+0

वातावरण बदलने के बारे में बहुत अच्छा विचार । मुझे इसका इस्तेमाल करना चाहिए। यह एक बोनस विचार है! –

+0

इस उदाहरण में मैं वस्तुओं को देखता हूं rand1 और rand2 बनाए जाते हैं, लेकिन यह भी myObjects ऑब्जेक्ट को आउटपुट करने लगता है। यदि मैं किसी वस्तु को इस मैपली() के परिणाम असाइन करता हूं तो मैं myObjects PLUS rand1 और rand2 की एक प्रति के साथ समाप्त होता हूं। किंडा शोर और अक्षम लगता है। क्या यह लागू करने का एक अलग स्वाद होना चाहिए? –

6

attach(myObjects)

+2

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

+0

+1 उस उपयोग को या तो नहीं माना जाता था। – Shane

+2

मुझे नहीं लगता कि यह अनुलग्नक का उपयोग करना हमेशा अच्छा विचार है। लेकिन यदि आप इसका उपयोग करने जा रहे हैं, तो इसका इस्तेमाल करें, इसका अपना संस्करण न लिखें। – hadley