سؤال

عندما أجد برمجة في Stata نفسي باستخدام مؤشر الحلقة في البرمجة. على سبيل المثال، سأقوم بحلقة على قائمة بالمتغيرات.

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.

في R الطريقة التي وصلت إليها للقيام بنفس الشيء سيكون:

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() 
}

يبدو الرمز الصيني هذا بلا شك وفوضي بالنسبة لي ولم أجد طريقة جيدة للقيام بهذا النوع من الأشياء في R حتى الآن. ربما أنا فقط لا أفكر في المشكلة بالطريقة الصحيحة؟ هل يمكنك اقتراح طريقة أفضل للحلقة باستخدام السلاسل؟

هل كانت مفيدة؟

المحلول

كما حدث أشخاص آخرون، سيكون هذا أسهل إذا كان لديك إطعام مع أعمدة باسم nominalprice و realprice. وبعد إذا كنت لا، فيمكنك دائما استخدام get. وبعد يجب أن لا تحتاج parse على الإطلاق هنا.

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

نصائح أخرى

إذا كانت مشكلتك الرئيسية هي الحاجة إلى كتابة eval (تحليل (نص = I)) بدلا من "سأكون"، فيمكنك إنشاء وظائف أبسط للاستخدام لتقييم التعبيرات من السلاسل:

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

ثم يمكن تبسيط "ص" إلى:

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

باستخدام ggplot2 وإعادة تشكيل:

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)

لا أرى ما هو الخطأ بشكل خاص في حلكم الأصلي، إلا أنني لا أعرف لماذا تستخدم وظيفة Eval (). هذا لا يبدو ضروريا بالنسبة لي.

يمكنك أيضا استخدام وظيفة تطبيق، مثل Lapply. إليك مثال عمل. أنشأت بيانات دمية ك 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)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top