Pregunta

Cuando se programa en Stata a menudo me encuentro con el índice del bucle en la programación. Por ejemplo, voy a un bucle sobre una lista de las variables nominalprice y realprice:

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

Esto trazar las series temporales de los precios nominales y reales y exportar un gráfico llamado TimePlot-nominalprice.png y otro llamado TimePlot-realprice.png.

En el método R Yo he llegado con hacer lo mismo sería:

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

Este código R parece poco intuitivo y desordenado a mí y no he encontrado una buena manera de hacer este tipo de cosas en I todavía. Tal vez simplemente no estoy pensando en el problema de la manera correcta? ¿Puede sugerir una mejor forma de bucle que utiliza cuerdas?

¿Fue útil?

Solución

Como otras personas han dado a entender, esto sería más fácil si has tenido una trama de datos con columnas llamadas nominalprice y realprice. Si no lo hace, siempre se puede utilizar get. No debería ser necesario parse a todos aquí.

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

Otros consejos

Si su principal problema es la necesidad de escribir eval (análisis sintáctico (texto = i)) en lugar de `` i'`, se podría crear una funciones más simples de usar para evaluar expresiones de cadenas:

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

A continuación, el ejemplo R podría simplificarse a:

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

El uso de ggplot2 y formar de nuevo:

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)

No veo lo que es especialmente mal con su solución original, excepto que no sé por qué estás usando la función eval (). Eso no parece necesario para mí.

También puede utilizar una función de aplicación, tales como lapply. Aquí hay un ejemplo de trabajo. Creé datos ficticios como una serie de tiempo zoo() (esto no es necesario, pero ya que se trabaja con datos de series de tiempo de todos modos):

# 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)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top