2011-09-14 10 views
6

मैं आर में हैश मानचित्र का उपयोग करने का एक तरीका ढूंढने की कोशिश कर रहा हूं, और कुछ खोज के बाद मुझे आर-पर्यावरण मिलता है। लेकिन मैं पर्यावरण में सभी वस्तुओं के माध्यम से कैसे पुन: प्रयास कर सकता हूं? इस तरह जब मैं निम्नलिखित कोड चलाने के लिए, मैं उम्मीद कर रहा था उत्पादन:आरएच वातावरण में हैश आइटम के माध्यम से कैसे पुनरावृत्त करें?

लेकिन मैं बजाय शून्य की दो पंक्तियाँ मिलता है, मुझे लगता है मैं क्या चाहते हैं कैसे मिल सकता है?

map <- new.env(hash=T, parent=emptyenv()) 
assign('a', 1, map) 
assign('b', 2, map) 
for (v in ls(map)) { 
    print(map$v) 
} 
+0

'ls' रिटर्न नाम, ऑब्जेक्ट्स नहीं। 'प्रयास करें प्रिंट (नक्शा [[वी]]' –

उत्तर

10

"$" के उपयोग के एक समारोह में जहां यह इनपुट व्याख्या करने के लिए वांछित है अंदर प्रोग्रामिंग त्रुटि का एक आम स्रोत है। इसके बजाय फॉर्म ऑब्जेक्ट [[value]] (उद्धरण के बिना) का उपयोग करें।

for (v in ls(map)) { 
    print(map[[v]]) 
} 
+0

धन्यवाद आदमी, यह काम करता है! –

7

यह इस बात पर निर्भर करता है कि आप क्या करना चाहते हैं। मुझे लगता है कि ऊपर print उदाहरण कुछ ऐसा है जो आप एक उदाहरण के रूप में कर रहे हैं लेकिन आप प्रिंट करने से कुछ और करना चाहते हैं!

यदि आप किसी पर्यावरण के प्रत्येक तत्व के आधार पर कोई ऑब्जेक्ट प्राप्त करना चाहते हैं, तो आप eapply(env, function) का उपयोग करें। यह अन्य *apply() फ़ंक्शंस की तरह काम करता है। यह एक सूची देता है जिसका ऑब्जेक्ट आपके द्वारा बनाए गए ऑब्जेक्ट्स को eapply() पर भेजा गया है और जिनके नाम पर्यावरण से कॉपी किए गए हैं।

उदाहरण के लिए, अपने विशिष्ट मामले

map <- new.env(hash=T, parent=emptyenv()) 
assign('a', 1, map) 
assign('b', 2, map) 

eapply(map, identity) 

में दो तत्वों की सूची देता है। यह एक हैश टेबल की तरह दिखता है जो दिखाता है कि आप एक हैश टेबल को पर्यावरण की बजाय सूची के रूप में कार्यान्वित कर सकते हैं (जो थोड़ा अपरंपरागत है, लेकिन निश्चित रूप से दिलचस्प है)।

देखने के लिए कि यह कैसे कुछ गैर तुच्छ, कस्टम फ़ंक्शन के लिए काम करेगा, यहाँ एक उदाहरण

eapply(map, function(e) { 
    # e here stands for a copy of an element of the environment 
    e <- my.function(e) 
    my.other.function(e) 
}) 

है आप के बजाय एक ऐसे वातावरण के तत्वों में से प्रत्येक के लिए कुछ करना चाहते हैं लौटने के बिना अंत में एक सूची वस्तु, आपको अपने उत्तर में @DWin जैसे लूप का उपयोग करना चाहिए।

मेरी चिंता यह है कि आप वास्तव में प्रिंट करना नहीं चाहते हैं, लेकिन अंततः आप अपने "हैश टेबल" तत्वों के आधार पर ऑब्जेक्ट्स बनायेंगे और फिर उन्हें आगे की प्रक्रिया के लिए सूची में वापस रखेंगे। उस उदाहरण में, आपको वास्तव में eapply() का उपयोग करना चाहिए। कोड क्लीनर होगा और यह आर के मुहावरों का अधिक निकटता से पालन करेगा। यह आपके लिए परिणामों की सूची बनाने और बनाने की देखभाल करता है।

+0

बेहतर होगा ओपी के समस्या को हल करने के लिए एक उदाहरण प्रदान करने के लिए होगा: 'eapply (मानचित्र, पहचान)' – James

+0

ओपी की समस्या वह एक के माध्यम से पुनरावृति करने के लिए कैसे पता नहीं है कि है पर्यावरण। और ​​मैंने उसे ऐसा करने के लिए एक आसान काम के बारे में बताया। एक जो आर के मुहावरे का पालन करता है, वह अच्छी तरह से – adamleerich

+0

सच है, लेकिन उसके पास एक विशिष्ट मामला उपयोग भी था, जवाब अब बेहतर है, इसलिए आपके पास एक वोट है। हालांकि सावधान रहें : इसके दुष्प्रभावों के कारण 'प्रिंट' हमेशा '* लागू' कथन में उपयोग की जाने वाली अपेक्षाओं को नहीं देता है। – James

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