在 lapply 中迭代时打印列表名称在 3.2 中不起作用

print list names while iterating in lapply not working in 3.2

每次我 运行 通过 lapply 函数时,我都在尝试输出列表名称。我发布了我之前发布的 ,在我将 R 升级到 3.2.0 版之前,@Ananda Mahto 提供的答案工作正常。它不再工作,我收到以下错误消息: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)

我不确定问题出在哪里,但我检查了新版本 R 中的所有语法,没有任何变化。任何帮助是极大的赞赏。我也乐于接受任何新想法。

稍微改造一下,效果一样,外观更简单:

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

我假设您希望 listvector 中的输出,因此 SIMPLIFY=FALSE 模仿 lapply。否则,它是一个更简单的向量。

它不是通用的,因为您必须显式传递名称和数据,但您可以创建一个三明治函数,但必须重新实现 lapply 功能。

我在这里使用的个人编码偏好是使用 message 而不是 print。理由是用户可以选择使用 suppressMessages(在 [=19= 之外],假设它 could/would 被埋在函数中),同时抑制 print 的输出电话有点多。