不希望变量名由字符串设置

时间:2016-02-20 00:04:52

标签: r

在下面的R代码中,如果我想拉取和分析SPY以外的符号的数据,我需要替换字符串" SPY"和变量名称SPY。 如何编写代码以便仅在一个地方设置股票代码?

library("quantmod")
getSymbols("SPY", from = '1990-01-01')
print(summary(monthly.prices <- Ad(SPY)[endpoints(SPY, on = 'months')]))
sym = "SPY"
# line below does not work
print(summary(monthly.prices <- Ad(sym)[endpoints(sym, on = 'months')]))

3 个答案:

答案 0 :(得分:3)

您可以编写一个将股票代码作为输入的函数。请注意,在auto.assign = FALSE中设置getSymbols()可让我们直接指定任何变量名称(此处我称之为dat)。然后我们在整个函数中使用dat。这样,您也可以轻松地运行其他符号,而无需更改代码中的任何内容。

symFun <- function(sym) {
    dat <- getSymbols(sym, from = "1990-01-01", auto.assign = FALSE)
    monthly.prices <- Ad(dat)[endpoints(dat, on = "months")]
    summary(monthly.prices)
}

symFun("SPY")
#     Index             SPY.Adjusted   
# Min.   :1993-01-29   Min.   : 28.60  
# 1st Qu.:1998-11-06   1st Qu.: 70.31  
# Median :2004-08-15   Median : 95.23  
# Mean   :2004-08-14   Mean   : 97.93  
# 3rd Qu.:2010-05-21   3rd Qu.:117.27  
# Max.   :2016-02-19   Max.   :208.17  

答案 1 :(得分:2)

您可以设置变量eval(parse(text=symbol)),然后使用def main(): a = 1 b = 2 c = a + b print("total", a + b + c) if __name__ == "__main__": main() 来调用实际变量。请注意,这可能不是很好的练习,也很难阅读/维护。

答案 2 :(得分:1)

当我运行getSymbols时,它会产生一个我不完全理解的警告(我也不知道该特定功能应该做什么),但我不会&#39 ;认为它与你问题的核心相关。

两个选项......

选项1

eval(parse(text = x))会将字符x评估为表达式。也就是说,它等同于在运行时使用x的值替换该位代码。

library("quantmod")
sym <- "SPY"
getSymbols(sym, from = '1990-01-01')
q1 <- summary(Ad(SPY)[endpoints(SPY, on = 'months')])
xts_obj <- eval(parse(text = sym))
q2 <- summary(Ad(xts_obj)[endpoints(xts_obj, on = 'months')])
print(all(q1==q2))

选项2

这更干净,但只有getSymbols默认功能才可以通过auto.assign参数覆盖。如果函数总是进行<<-样式赋值,那么您可以做的最好的事情就是创建一个包装函数

library("quantmod")
sym <- "SPY"
getSymbols(sym, from = '1990-01-01', auto.assign = T)
q1 <- summary(Ad(SPY)[endpoints(SPY, on = 'months')])
q2 <- getSymbols(sym, from = '1990-01-01', auto.assign = F)
print(all(q1==q2))