Domanda

Quando si programma in Stata mi ritrovo spesso utilizzando l'indice del ciclo di programmazione. Per esempio, io loop su un elenco delle variabili nominalprice e realprice:

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

In questo modo tracciare la serie storica dei prezzi nominali e reali ed esportare un grafico chiamato TimePlot-nominalprice.png e un altro chiamato TimePlot-realprice.png.

R il metodo che è venuta in mente di fare la stessa cosa potrebbe essere:

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

Questo codice R sembra poco intuitivo e disordinato a me e non ho trovato un buon modo per fare questo genere di cose in R ancora. Forse sto solo non pensare al problema nel modo giusto? Si può suggerire un modo migliore per ciclo utilizzando stringhe?

È stato utile?

Soluzione

Come altre persone hanno lasciato intendere, questo sarebbe più facile se si ha un dataframe con colonne denominate nominalprice e realprice. Se non lo fai, si può sempre usare get. Non dovrebbe essere necessario parse affatto qui.

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

Altri suggerimenti

Se il problema principale è la necessità di digitare eval (parse (text = i)) invece di `` i'`, si potrebbe creare un funzioni più semplici da usare per valutare le espressioni dalle stringhe:

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

Poi l'esempio R potrebbe essere semplificata per:

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

Utilizzando ggplot2 e rimodellare:

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)

Non vedo cosa c'è di particolarmente sbagliato con la vostra soluzione originale, solo che non so il motivo per cui si sta utilizzando la funzione eval (). Non mi sembra necessario per me.

È anche possibile utilizzare una funzione di applicazione, come ad esempio lapply. Ecco un esempio di lavoro. Ho creato dati fittizi come una serie storica zoo() (questo non è necessario, ma dal momento che si sta lavorando con dati di serie temporali comunque):

# 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)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top