आर

2009-11-02 11 views
12

में स्ट्रिंग चर के ऊपर लूप जब स्टाटा I में प्रोग्रामिंग अक्सर प्रोग्रामिंग में लूप इंडेक्स का उपयोग करके खुद को ढूंढती है। उदाहरण के लिए चरों की सूची से अधिक पाश nominalprice, मैं करता हूँ और realprice:आर

local list = "nominalprice realprice" 
foreach i of local list { 
    summarize `i' 
    twoway (scatter `i' time) 
    graph export "C:\TimePlot-`i'.png" 
} 

यह नाममात्र और वास्तविक कीमतों के समय श्रृंखला साजिश और एक ग्राफ कहा जाता TimePlot-nominalprice.png निर्यात और एक अन्य बुलाया TimePlot- होगा realprice.png।

आर में विधि मैं एक ही बात करने के लिए लेकर आए हैं होगा:

clist <- c("nominalprice", "realprice") 
for (i in clist) { 
    e <- paste("png(\"c:/TimePlot-",i,".png\")", sep="") 
    eval(parse(text=e)) 
    plot(time, eval(parse(text=i))) 
    dev.off() 
} 

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

उत्तर

16

के रूप में अन्य लोगों को सूचित किया है, यह आसान है अगर आप nominalprice और realprice नामित कॉलम के साथ एक dataframe था होगा। यदि आप नहीं करते हैं, तो आप हमेशा get का उपयोग कर सकते हैं। आपको यहां parse की आवश्यकता नहीं है।

clist <- c("nominalprice", "realprice") 
for (i in clist) { 
    png(paste("c:/TimePlot-",i,".png"), sep="") 
    plot(time, get(i)) 
    dev.off() 
} 
+0

धन्यवाद जोनाथन। मुझे get (i) विकल्प पसंद है और मैं इसके साथ काम करने की कोशिश करूंगा। मैं जिस डेटा का उपयोग कर रहा था वह डमी डेटा है इसलिए डेटाफ्रेम में संरचित किया जा सकता है। डेटाफ्रेम का उपयोग करते समय क्या अलग होगा? – aTron

+0

क्योंकि तब स्ट्रिंग द्वारा एक्सेस करना आसान है। मान लें कि आपके पास 'नाममात्र' नामक कॉलम के साथ डेटा फ्रेम 'df' है। फिर आप उस कॉलम को प्राप्त करने के लिए केवल 'df [, "nominalprice"] लिख सकते हैं। –

1

मुझे नहीं लगता कि आपके मूल समाधान के साथ विशेष रूप से क्या गलत है, सिवाय इसके कि मुझे नहीं पता कि आप eval() फ़ंक्शन का उपयोग क्यों कर रहे हैं। यह मेरे लिए जरूरी नहीं लगता है।

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

# x <- some time series data 
time <- as.Date("2003-02-01") + c(1, 3, 7, 9, 14) - 1 
x <- zoo(data.frame(nominalprice=rnorm(5),realprice=rnorm(5)), time) 
lapply(c("nominalprice", "realprice"), function(c.name, x) { 
    png(paste("c:/TimePlot-", c.name, ".png", sep="")) 
    plot(x[,c.name], main=c.name) 
    dev.off() 
}, x=x) 
+0

उपरोक्त फ़ंक्शन में c.name का क्या संदर्भ है? मैं यह समझने की कोशिश कर रहा हूं कि मैं इस तकनीक को अन्य परिस्थितियों में कैसे लागू कर सकता हूं। – aTron

+0

c.name एक परिवर्तनीय नाम है जिसे मैं लापरवाही से गुज़रने के लिए असाइन कर रहा हूं (उदाहरण के लिए, इस उदाहरण में, उस वेक्टर के प्रत्येक तत्व को एक बार में गुजर रहा है)। यह कैसे काम करता है यह देखने के लिए इस के साथ खेलने का प्रयास करें: लापरवाही (सी (1,2,3), फ़ंक्शन (x) प्रिंट (x))। भी देखो? लापरवाही। – Shane

2

अपने मुख्य मुद्दा (पाठ टाइप करने के लिए eval (पार्स की जरूरत है = i)) के बजाय `` की i'`, यदि आप इससे आसान से उपयोग कार्यों तार से भाव के मूल्यांकन के लिए बना सकते हैं:

clist <- c("nominalprice", "realprice") 
for (i in clist) { 
    png(paste("c:/TimePlot-", i, ".png", sep="")) 
    plot(time, e(i)) 
    dev.off() 
} 
+0

आपके उत्तर के लिए धन्यवाद! यह एक बहुत उपयोगी युक्ति है। यह निश्चित रूप से मेरे कोडिंग को सरल बना देगा। – aTron

+0

मुझे लगता है कि आपको पाने के लिए जोनाथन चांग द्वारा दिखाए गए() का उपयोग करना चाहिए। –

1
:

e = function(expr) eval(parse(text=expr)) 

फिर आर उदाहरण के लिए सरल किया जा सकता है

ggplot2 ए का उपयोग करना nd नयी आकृति प्रदान:

library(ggplot2) 
library(reshape) 
df <- data.frame(nominalprice=rexp(10), time=1:10) 
df <- transform(df, realprice=nominalprice*runif(10,.9,1.1)) 
dfm <- melt(df, id.var=c("time")) 
qplot(time, value, facets=~variable, data=dfm)