我有一个大约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))
答案 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()
...