Pergunta

Ao programar em Stata Sinto-me frequentemente usando o índice de ciclo na programação. Por exemplo, eu vou loop sobre uma lista das variáveis ??nominalprice e Realprice:

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

Isto irá traçar a série temporal de preços nominais e reais e exportação de um gráfico chamado TimePlot-nominalprice.png e outro chamado TimePlot-realprice.png.

Em R o método que eu vim acima com para fazer a mesma coisa seria:

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 unintuitive e confuso para mim e eu não encontrei uma boa maneira de fazer esse tipo de coisa em R ainda. Talvez eu não estou pensando sobre o problema da maneira certa? você pode sugerir uma maneira melhor de loop usando cordas?

Foi útil?

Solução

Como outras pessoas a entender, isso seria mais fácil se você tivesse uma trama de dados com colunas nomeadas nominalprice e realprice. Se você não fizer isso, você poderia sempre usar get. Você não deve precisar parse em tudo aqui.

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

Outras dicas

Se o seu principal problema é a necessidade de digitar eval (parse (text = i)) em vez de `` i'`, você pode criar uma série de funções mais simples de usar para avaliar expressões de strings:

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

Em seguida, o exemplo R pode ser simplificada para:

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

Usando ggplot2 e remodelar:

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)

Eu não vejo o que é especialmente errado com a sua solução original, exceto que eu não sei por que você está usando a função eval (). Isso não parece necessária para mim.

Você também pode usar uma função de aplicar, como lapply. Aqui está um exemplo de trabalho. Eu criei dados fictícios como uma série temporal zoo() (isso não é necessário, mas desde que você está trabalhando com dados de séries temporais de qualquer maneira):

# 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top