打印列表名称,而在lapply迭代不在3.2中工作

时间:2015-05-19 15:36:59

标签: r loops lapply

每次运行lapply函数时,我都在尝试输出列表名称。我发布了我之前发布的question earlier,@Ananda Mahto提供的答案工作正常,直到我将R升级到版本3.2.0。它不再有效,我收到以下错误消息: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新版本中的所有语法没有任何改变。任何帮助是极大的赞赏。我也对任何新想法持开放态度。

1 个答案:

答案 0 :(得分:3)

如果你稍微重组一下,你可以通过更简单的外观获得相同的效果:

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

我假设您希望list副作品中的输出vector,而是SIMPLIFY=FALSE来模仿lapply。否则,它是一个更简单的向量。

虽然您必须以重新实现lapply功能为代价来创建三明治函数,但它并不是通用的,因为您必须明确地传递名称和数据。

我在此处使用的个人编码偏好是使用message而不是print。基本原理是用户可以选择使用suppressMessages(在mapply之外,假设它可以/将被隐藏在函数中),而抑制print调用的输出是多一点工作。