在迭代lapply时打印列表名称

时间:2015-01-01 00:52:05

标签: r lapply

我在名为dat.list的列表名称中有一个时间序列(x,y,z和a)。我想使用lapply将函数应用于此列表。有没有办法可以在lapply完成每次迭代后打印元素名称,即x,y,z和a。以下是可重现的例子。

## Create Dummy Data

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)

## forecast using lapply

abc <- function(x) {
  r <- mean(x)
  print(names(x))
  return(r)
}

forl <- lapply(dat.list,abc)

基本上,每次在这些元素上执行函数时,我都想打印元素名称x,y,z和a。当我运行上面的代码时,我会打印出空值。

2 个答案:

答案 0 :(得分:2)

你可以使用一些深挖(我从另一个答案得到的SO - 我会尝试找到链接)并做这样的事情:

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

forl <- lapply(dat.list, abc)
# [1] "x"
# [1] "y"
# [1] "z"
# [1] "a"
forl
# $x
# [1] 5.035647
# 
# $y
# [1] 19.78315
# 
# $z
# [1] 39.18325
# 
# $a
# [1] 58.83891

我们只能lapply list的名称(类似于@BondedDust所做的那样),就像这样(但是你输掉了输出中的列表名称):

abc <- function(x, y) {
  r <- mean(y[[x]])
  print(x)
  return(r)
}

lapply(names(dat.list), abc, y = dat.list)

答案 1 :(得分:1)

项目名称不会从lapply传递给第二个参数,只有值可以。因此,如果您想查看名称,则调用策略需要不同:

> abc <- function(nm, x) {
+   r <- mean(x)
+   print(nm)
+   return(r)
+ }
> 
> forl <- mapply(abc, names(dat.list), dat.list)
[1] "x"
[1] "y"
[1] "z"
[1] "a"