लूप के लिए चर नाम की एक सूची तैयार करें, फिर उन्हें मान असाइन करें


27

मुझे आश्चर्य है कि अगर लूप का उपयोग करके चर की एक सूची तैयार करने का एक सरल तरीका है, और इसका मूल्य दें।

for(i in 1:3)
{
  noquote(paste("a",i,sep=""))=i
}

उपरोक्त कोड में, मैं बनाने का प्रयास करें a1, a2, a3, 1, 2, 3 हालांकि, आर एक त्रुटि संदेश देता है जिनमें से मूल्यों के लिए आवंटित। आपकी सहायता के लिए धन्यवाद।


3
मुझे संदेह है कि आपको ऐसा करना होगा - ऐसा लगता है कि आप बहुत गलत तरीके से कुछ बना रहे हैं।

@mbq, उदाहरण के लिए साक्षात्कार में यह बहुत सामान्य कोडिंग अभ्यास है। ऐसा नहीं है कि मैं इसकी वकालत कर रहा हूं, मेरी शीर्ष दुष्ट सॉफ्टवेयर सूची में एक्सेल की तुलना में केवल साक्षात्कार थोड़ा कम है :)
एमपिकेट

6
आर में @mpiktas, यह एक सूची बनाने के लिए और अधिक प्राकृतिक है, इसका सेट namesपैरामीटर और बाद में या तो बस इसे उपयोग करते हैं, attachयह है या यह एक वातावरण में तब्दील साथ list2envऔर evalइसके अंदर। कोई छोरों, पार्स या अन्य बदसूरत सामान के साथ।

@mbq, hm, list2envएक अपेक्षाकृत नया कार्य है। और फिर भी यह कुछ वातावरण में चर का उत्पादन करेगा, जब ओपी शीर्ष वातावरण में चर प्राप्त करना चाहता है। तो कुरूपता अभी भी बनी हुई है :)
mpiktas

2
इसी तरह की प्रकृति के भविष्य के सवालों के लिए, मेरा सुझाव है कि इस तरह का प्रश्न वास्तव में स्टैकऑवरफ़्लो पर है। प्रश्न का प्रति सेहत से कोई लेना-देना नहीं है।
मंगल

जवाबों:


41

आपका के लिए देख रहे हैं assign()

for(i in 1:3){
  assign(paste("a", i, sep = ""), i)    
}

देता है

> ls()
[1] "a1"          "a2"          "a3" 

तथा

> a1
[1] 1
> a2
[1] 2
> a3
[1] 3

अद्यतन करें

मैं मानता हूं कि लूप का उपयोग करना (बहुत बार) खराब आर कोडिंग शैली है (ऊपर चर्चा देखें)। का उपयोग कर list2env()(यह उल्लेख करने के लिए @mbq के लिए धन्यवाद), यह @ शान लिन शांग के सवाल का एक और समाधान है:

x <- as.list(rnorm(10000))
names(x) <- paste("a", 1:length(x), sep = "")
list2env(x , envir = .GlobalEnv)

21

यदि मान वेक्टर में हैं, तो लूप आवश्यक नहीं है:

vals <- rnorm(3)
n    <- length(vals)
lhs  <- paste("a",    1:n,     sep="")
rhs  <- paste("vals[",1:n,"]", sep="")
eq   <- paste(paste(lhs, rhs, sep="<-"), collapse=";")
eval(parse(text=eq))

एक साइड नोट के रूप में, यही कारण है कि मैं आर को प्यार करता हूं।


4
library(fortunes) fortune(106)
रोमन लुसट्रिक

@Roman, अजीब, मैं parseR मदद पृष्ठों को पढ़ने के बाद उपयोग करना शुरू कर दिया है । मैं मानता हूं कि कभी-कभी यह ओवरकिल होता है, उदाहरण के लिए formulaप्रबंधन में, लेकिन मैंने इसे बहुत उपयोगी पाया। ध्यान दें कि मैं प्रश्न को फिर से भाग्य के अनुसार नहीं बता सकता, क्योंकि मैंने यह नहीं पूछा था।
एमपिकेटस

1
@mpiktas: यह इस तथ्य के साथ करना है कि अंतर्निहित स्कोपिंग नियम किसी फ़ंक्शन के भीतर उपयोग किए जाने पर अप्रत्याशित परिणाम दे सकते हैं। इसके अलावा (जैसा कि हेल्प फाइल्स में बताया गया है), R और S, स्कोपिंग नियमों में अंतर के कारण एक अलग परिणाम दे सकते हैं। यह अन्य समाधानों की तुलना में धीमा भी है। यह तब होगा जब आपको कई बार ऐसा करना होगा। और आखिरी लेकिन कम से कम नहीं, ज्यादातर मामलों में eval (parse ()) का उपयोग करने की तुलना में अधिक सुरुचिपूर्ण और आसान समाधान है। इस मामले में जो सूचियों के साथ काम कर रहा है या असाइन का उपयोग कर रहा है।
जोरिस मेय्स

1
@mpiktas: मैंने कभी नहीं कहा कि यह कमी है। मैंने आपको सिर्फ यही कारण बताया कि सामान्य तौर पर आर कोर डेवलपमेंट टीम के सदस्य थॉमस लुमले द्वारा एक इवेल (पार्स ()) निर्माण की सलाह दी जाती है। (@ रेमन लेस्त्क के रेफरेंस को देखें)
जॉरिस मेयस

1
वास्तव में, कई एकल तत्व चर बनाने के लिए
असाइनमेंट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.