每次运行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
新版本中的所有语法没有任何改变。任何帮助是极大的赞赏。我也对任何新想法持开放态度。
答案 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
调用的输出是多一点工作。