Frage

Wenn in Stata Programmierung ich finde mich oft die Schleife Index in der Programmierung. Zum Beispiel werde ich eine Schleife über eine Liste der Variablen nominalprice und realprice:

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

Damit wird die Zeitreihe der nominalen und realen Preise plotten und ein Diagramm namens TimePlot-nominalprice.png und eine andere namens TimePlot-realprice.png exportieren.

R die Methode, die ich habe kommen mit der gleichen Sache zu tun wäre:

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

Der R-Code sieht nicht intuitiv und chaotisch zu mir und ich habe nicht eine gute Art und Weise zu tun, um diese Art der Sache in R noch nicht gefunden. Ich denke, vielleicht nur nicht über das Problem der richtige Weg? Können Sie sich einen besseren Weg, um Schleife Strings vorschlagen?

War es hilfreich?

Lösung

Wie andere Menschen angedeutet haben, das wäre einfacher, wenn Sie einen Datenrahmen mit Spalten namens nominalprice und realprice haben. Wenn Sie nicht tun, könnten Sie immer get verwenden. Sie sollten nicht parse überhaupt hier benötigen.

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

Andere Tipps

Wenn Ihr Hauptproblem ist die Notwendigkeit eval eingeben (parst (text = i)) anstelle von `` i'`, Sie könnten eine einfacher zu bedienende Funktionen erstellen für Ausdrücke von Strings Auswertung:

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

Dann könnte das R Beispiel vereinfacht werden:

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

Mit ggplot2 und umformen:

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)

Ich sehe nicht, was mit Ihrer ursprünglichen Lösung besonders falsch ist, außer, dass ich weiß nicht, warum Sie die Funktion eval () verwenden. Das scheint nicht nötig zu mir.

Sie können auch eine Anwendung Funktion, wie lapply verwenden. Hier ist ein funktionierendes Beispiel. Ich habe Dummy-Daten als zoo() Zeitreihe (dies nicht notwendig ist, aber da Sie mit Zeitreihendaten arbeiten sowieso):

# 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)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top