r
2016-02-20 40 views 0 likes 
0

在下面的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')])) 

回答

1

當我運行getSymbols時,它產生了一個警告,我沒有完全理解(我也不知道該特定函數應該做什麼),但我認爲它與您的問題的核心沒有關係。

兩個選項...

選項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)) 
2

你可以設置一個變量symbol = "SPY",然後用eval(parse(text=symbol))調用實際的變量。請注意,這可能不是很好的做法,也很難讀懂/維護。

3

你可以寫一個函數,它的股票代碼作爲輸入。請注意,在getSymbols()中設置auto.assign = FALSE允許我們直接指定任何變量名稱(這裏我稱之爲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 
相關問題