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

R - Use names in a list to feed named objects to a loop?

我有一个包含大约 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))

正如您所注意到的,您在调用 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()...

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

考虑 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内部函数以通过其字符串名称检索对象,然后类似地运行 lapplysetNames:

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)