質問
のStataでプログラミングする場合、私は多くの場合、プログラミングでのループインデックスを使用して自分自身を見つけます。例えば、私は、変数のリストをループはnominalpriceうとrealpriceます:
local list = "nominalprice realprice"
foreach i of local list {
summarize `i'
twoway (scatter `i' time)
graph export "C:\TimePlot-`i'.png"
}
これは、名目と実質価格の時系列をプロットし、TimePlot-nominalprice.pngと別のと呼ばれるTimePlot-realprice.pngと呼ばれる1つのグラフをエクスポートします。
Rで、私は同じことをやって作ってみた方法は以下のようになります:
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()
}
このRコードは、私にはわかりにくいと乱雑に見えると私はまだRにおけるこの種のものを行うには良い方法を発見していません。たぶん私はちょうど右の方法の問題について考えていませんよ?あなたは、文字列を使用してループするより良い方法を提案することはできますか?
解決
他の人が暗示しているとして、あなたは
nominalprice
とrealprice
という名前の列を持つデータフレームを持っていた場合は、、これは容易になるだろう。そうしないと、あなたは常にget
を使用することができます。あなたはすべてここでparse
を必要はありません。
clist <- c("nominalprice", "realprice")
for (i in clist) {
png(paste("c:/TimePlot-",i,".png"), sep="")
plot(time, get(i))
dev.off()
}
他のヒント
あなたの主な問題は、代わりに `` i'`のはeval(パースを(テキスト= i))を入力する必要のある場合は、
は、文字列から式を評価するための単純に使える関数を作成することができます:
e = function(expr) eval(parse(text=expr))
そしてR例に単純化することができます:
clist <- c("nominalprice", "realprice")
for (i in clist) {
png(paste("c:/TimePlot-", i, ".png", sep=""))
plot(time, e(i))
dev.off()
}
ggplot2を使用して再形成ます:
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)
私はあなたのeval()関数を使用している理由を私は知らないことを除いて、あなたのオリジナルのソリューションでは特に何が間違って表示されません。それは私には必要ないないようです。
また、このようなlapplyとして、適用する機能を使用することができます。ここでは作業例です。私は(これは必要ありませんが、とにかく時系列データを操作しているので)zoo()
時系列としてダミーデータを作成します:
# 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)
所属していません StackOverflow