R - 使用列表中的名称将命名对象提供给循环?

时间:2017-07-18 22:37:21

标签: r for-loop dataframe zoo names

我有一个大约90个财务符号的数据框(为简单起见将使用3)

> 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))

2 个答案:

答案 0 :(得分:1)

考虑使用lapply setNames来创建 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内部函数以通过其字符串名称检索对象,然后类似地使用lapply运行setNames

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)

答案 1 :(得分: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() ...

之类的操作对列表中的所有元素进行操作