0

I'm trying o output the list names every time I run the function thru lapply. I posted this question earlier that I posted earlier, and the answer provided by @Ananda Mahto worked fine until I upgraded my R to version 3.2.0. It is no longer working and I get the following error message: Error in eval.parent(quote(names(X)))[substitute(x)[[3]]] : invalid subscript type 'symbol'

x <- ts(rnorm(40,5), start = c(1961, 1), frequency = 12)
y <- ts(rnorm(50,20), start = c(1971, 1), frequency = 12)
z <- ts(rnorm(50,39), start = c(1981, 1), frequency = 12)
a <- ts(rnorm(50,59), start = c(1991, 1), frequency = 12)

dat.list <- list(x=x,y=y,z=z,a=a)

abc <- function(x) {
  r <- mean(x)
  print(eval.parent(quote(names(X)))[substitute(x)[[3]]])
  return(r)
}

forl <- lapply(dat.list, abc)

I'm not sure what the issues is, but I checked all the syntax in the new version of R nothing has changed. Any help is greatly appreciated. I'm open to any new ideas as well.

Community
  • 1
  • 1
forecaster
  • 1,084
  • 1
  • 14
  • 35

1 Answers1

3

If you restructure it a little, you can get the same effect with a simpler appearance:

set.seed(42)
## using your dat.list construction code from above
abc <- function(x) { r <- mean(x); return(r); }

forl <- mapply(function(n, x) {
        message(n)
        abc(x)
    }, names(dat.list), dat.list, SIMPLIFY=FALSE)
## x
## y
## z
## a

forl
## $x
## [1] 4.960464
## $y
## [1] 20.1141
## $z
## [1] 38.87175
## $a
## [1] 58.89825

I'm presuming you wanted the output in a list vice a vector, ergo SIMPLIFY=FALSE to mimic lapply. Otherwise, it's a simpler vector.

It's not as generic in that you have to explicitly pass the names as well as the dat, though you can create a sandwich function at the cost of having to reimplement lapply functionality.

A personal coding preference I'm using here is the use of message over print. The rationale is that the user has the option to use suppressMessages (outside the mapply, assuming it could/would be buried in a function), whereas suppressing the output of a print call is a bit more work.

r2evans
  • 141,215
  • 6
  • 77
  • 149
  • Fantastic, thank you. And your approach is quick compared to te approach outlined in my question. Any idea on why that could be ? Much appreciated. – forecaster May 21 '15 at 01:25
  • If I had to guess, perhaps it's because I'm not processing anything to determine the string to print. But I haven't profiled it, so I don't know for certain. Glad to hear it works for you. – r2evans May 21 '15 at 02:01