2015-05-19 55 views
0

我试图o每次通过lapply运行函数时输出列表名称。我发布了之前发布的question earlier,并且由@Ananda Mahto提供的答案正常工作,直到我将我的R升级到版本3.2.0。它不再工作,我得到了以下错误消息:Error in eval.parent(quote(names(X)))[substitute(x)[[3]]] : invalid subscript type 'symbol'在lapply中迭代时打印列表名称不工作3.2

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) 

我不知道问题是什么,但我查的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,ERGO SIMPLIFY=FALSE输出模仿lapply。否则,这是一个更简单的向量。

这不是一般的,你必须明确地通过名称以及dat,尽管你可以创建一个三明治功能,但必须重新实现lapply功能。

我在这里使用的个人编码偏好是使用message而不是print。理由是用户可以选择使用suppressMessagesmapply之外,假设它可以/将被埋在一个函数中),而抑制print调用的输出则有点多。

+0

太棒了,谢谢。与我的问题中概括的te方法相比,你的方法很快。任何想法为什么这可能是?非常感激。 – forecaster

+0

如果我不得不猜测,也许是因为我没有处理任何东西来确定要打印的字符串。但是我没有对它进行简介,所以我不确定。很高兴听到它适合你。 – r2evans