List<String> myStringList = new List<string>(); foreach (string s in myStringArray) { if (!myStringList.Contains(s)) { myStringList.Add(s); } }
Это O (n^2) , который не будет иметь значения для короткого списка, который будет наполненным в комбинацию, но мог быть быстро быть проблемой на большом наборе.
Как предполагали другие, это было бы проще, если бы у вас был фрейм данных со столбцами с именем 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()
}
Использование ggplot2 и reshape:
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 (). Мне это не кажется необходимым.
Вы также можете использовать функцию apply, например 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)
Если ваша основная проблема заключается в необходимости набирать eval (parse (text = i)) вместо «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()
}