在 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
我假设您希望 list
副 vector
中的输出,因此 SIMPLIFY=FALSE
模仿 lapply
。否则,它是一个更简单的向量。
它不是通用的,因为您必须显式传递名称和数据,但您可以创建一个三明治函数,但必须重新实现 lapply
功能。
我在这里使用的个人编码偏好是使用 message
而不是 print
。理由是用户可以选择使用 suppressMessages
(在 [=19= 之外],假设它 could/would 被埋在函数中),同时抑制 print
的输出电话有点多。
每次我 运行 通过 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
我假设您希望 list
副 vector
中的输出,因此 SIMPLIFY=FALSE
模仿 lapply
。否则,它是一个更简单的向量。
它不是通用的,因为您必须显式传递名称和数据,但您可以创建一个三明治函数,但必须重新实现 lapply
功能。
我在这里使用的个人编码偏好是使用 message
而不是 print
。理由是用户可以选择使用 suppressMessages
(在 [=19= 之外],假设它 could/would 被埋在函数中),同时抑制 print
的输出电话有点多。