2017-07-18 96 views
0

我有一些90個金融符號的數據幀(將使用3爲簡單起見)R - 使用列表中的名稱將命名對象提供給循環?

> View(syM)  
    symbol 
1 APPL 
2 YAHOO 
3 IBM 

我創建的獲取JSON數據爲這些符號的函數,並且產生輸出。基本上:

nX <- function(x) { 
    #get data for "x", format it, and store it in "nX" 
    nX <- x 
    return(nX) 
} 

我用一個循環來獲取數據,並存儲相應的每個符號後命名的動物園系列。

for (i in 1:nrow(syM)) { 
    assign(x = paste0(syM[i,]), 
    value = nX(x = syM[i,])) 
    Sys.sleep(time = 1) 
} 

這導致:

[1] "APPL"   "YAHOO"   "IBM" 

每個都是一個動物園系列數據的5列。此外,我想對每個系列做一些繪圖並輸出結果,最好使用for循環或更好的東西。

yN <- function(y) { 
    #plot "y" series, columns 2 and 3, and store it in "yN" 
    yN <- y[,2:3] 
    return(yN) 
} 

按照類似的邏輯,我以前的循環我想:

for (i in 1:nrow(syM)) { 
    assign(x = paste0(pairS[i,],".plot"), 
    value = yN(y = paste0(syM[i,]))) 
} 

但到目前爲止數據不被髮送到功能,只有符號的名稱,所以我自然會得到:

y[,2:3] : incorrect number of dimensions 

我也曾嘗試:

for (i in 1:nrow(syM)) { 
    assign(x = paste0(syM[i,],".plot"), 
    value = yN(y = ls(pattern = paste0(syM[i,])))) 
} 

也有類似的結果。當我手動輸入系列名稱時,它會將第一個符號的圖表保存爲「APPL.Plot」。

assign(paste0(syM[1,], ".Plot"), 
     value = yN(p = APPL)) 
+0

你肯定沒有收錄到'library'對於那些暗示加載此的各種包調用。此外,我建議在將來添加應用於'syM'的'dput'的輸出。 –

+0

會做,謝謝。我相信唯一使用的庫是'library(quantmod)',但那只是獲取符號的數據。 – MRGiacalone2005

回答

0

當你注意,你打電話YN與字符參數:

for (i in 1:nrow(syM)) { 
    assign(x = paste0(pairS[i,],".plot"), 
    value = yN(y = paste0(syM[i,]))) 
} 

paste0(syM[i,])是要解決一個字符,而不是看起來你試圖引用對象動物園。相反,使用類似get()

for (i in 1:nrow(syM)) { 
    assign(x = paste0(pairS[i,],".plot"), 
    value = yN(y = get(paste0(syM[i,])))) 
} 

或者僅僅是存儲您的動物園對象名單擺在首位,然後用類似lapply()列表中的所有元素進行操作......

+0

謝謝!那就是訣竅。我試圖避免把它們放在一個單獨的列表中,用'lapply()'。關鍵是使用'get()' – MRGiacalone2005

+0

太棒了!如果它適合您,請考慮將答案標記爲已接受。歡呼 –

1

考慮lapplysetNames創建NX返回的對象的命名列表:

nX_list <- setNames(lapply(syM$symbol, nX), syM$symbol) 

# OUTPUT ZOO OBJECTS BY NAMED INDEX 
nX_list$AAPL 
nX_list$YAHOO 
nX_list$IBM 

# CREATE SEPARATE OBJECTS FROM LIST 
# BUT NO NEED TO FLOOD GLOBAL ENVIR W/ 90 OBJECTS, JUST USE 1 LIST 
list2env(nX_list, envir=.GlobalEnv) 

對於繪圖功能,首先添加get內部函數檢索其字符串名稱的對象,然後用同樣運行setNameslapply

yN <- function(y) { 
    #plot "y" series, columns 2 and 3, and store it in "yN" 
    yobj <- get(nX_list[[y]])  # IF USING ABOVE LIST 
    yobj <- get(y)    # IF USING SEPARATE OBJECT 

    yN <- yobj[,2:3] 
    return(yN) 
} 

plot_list <- setNames(lapply(syM$symbol, yN), paste0(syM$symbol, ".plot")) 

# OUTPUT PLOTS BY NAMED INDEX 
plot_list$AAPL.plot 
plot_list$YAHOO.plot 
plot_list$IBM.plot 

# CREATE SEPARATE OBJECTS FROM LIST 
# BUT NO NEED TO FLOOD GLOBAL ENVIR W/ 90 OBJECTS, JUST USE 1 LIST 
list2env(plot_list, envir=.GlobalEnv) 
+0

我可以用'get()'和'paste0()'一起做到這一點。我使用for循環主要是將符號列表中的名字分別賦值給每個序列。我想我會重新考慮使用lapply()將它們綁定在一起。 – MRGiacalone2005

+0

但是,您使用'get()'選擇_yobj_會更好。 – MRGiacalone2005

+0

正如我在代碼中評論的那樣,** 1 **列表比90個對象更容易管理,特別是如果對象的結構相同,如5 col的* zoo *。 – Parfait