Question

Lors de la programmation dans Stata, je me surprends souvent à l'aide de l'index de la boucle dans la programmation. Par exemple, je vais boucler sur une liste des variables nominalprice et RealPrice:

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

tracera la série chronologique des prix nominaux et réels et exporter un graphique appelé Timeplot-nominalprice.png et un autre appelé Timeplot-realprice.png.

R la méthode que je suis venu avec pour faire la même chose serait:

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

Ce code R semble unintuitive et malpropre pour moi et je n'ai pas trouvé une bonne façon de faire ce genre de chose en R encore. Peut-être que je ne suis pas penser au problème de la bonne façon? Pouvez-vous suggérer une meilleure façon de boucle à l'aide des chaînes?

Était-ce utile?

La solution

Comme d'autres personnes ont laissé entendre, ce serait plus facile si vous aviez une trame de données avec des colonnes nommées nominalprice et realprice. Si vous ne le faites pas, vous pouvez toujours utiliser get. Vous ne devriez pas avoir parse du tout ici.

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

Autres conseils

Si votre problème principal est le besoin de taper eval (parse (text = i)) au lieu de `` i'`, vous pouvez créer une fonction plus simple à utiliser pour évaluer les expressions de chaînes:

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

Ensuite, l'exemple de R pourrait être simplifié à:

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

Utilisation ggplot2 et remodeler:

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)

Je ne vois pas ce qui est particulièrement mal avec votre solution originale, sauf que je ne sais pas pourquoi vous utilisez la fonction eval (). Cela ne semble pas nécessaire pour moi.

Vous pouvez également utiliser une fonction de transformation, tels que lapply. Voici un exemple de travail. J'ai créé des données fictives comme une série chronologique de zoo() (ce n'est pas nécessaire, mais puisque vous travaillez avec des données de séries chronologiques de toute façon):

# 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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top