Search code examples
rfor-loopdataframezoonames

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


I have a data frame of some 90 financial symbols (will use 3 for simplicity)

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

I created a function that gets JSON data for these symbols and produce an output. Basically:

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

I used a loop to get the data and store the zoo series named after each symbol accordingly.

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

Which results in:

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

Each is a zoo series with 5 columns of data.

Further, I want to get some plotting done to each series and output the result, preferably using a for loop or something better.

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

Following a similar logic to my previous loop I tried:

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

But so far the data is not being sent to the function, only the name of the symbol, so I naturally get:

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

I have also tried:

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

With similar results. When I input the name of the series manually it does save the plot of the first symbol as "APPL.Plot".

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

Solution

  • As you note, you're calling yN with a character argument in:

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

    paste0(syM[i,]) is going to resolve to a character and not the zoo object it appears you're trying to reference. Instead, use something like get():

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

    Or perhaps just store your zoo objects in a list in the first place and then operate on all elements of the list with something like lapply()...