2017-07-18 97 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