我如何使用attr< - 与lapply?

时间:2012-11-28 21:06:37

标签: r attributes lapply

或者说它更通用:如何在列表元素中添加多个属性?

我试图将属性设置为列表中的所有元素data.frames。最后,我想将names(myList)添加为内部每个data.frame的变量属性。但我甚至无法获得所有列表元素的静态属性。

lapply(myList,attr,which="myname") <- "myStaticName"

这不起作用,因为lapply无法与lapply<-一起使用。如果我至少知道如何做到这一点,也许我可以弄清楚如何使用不同的属性(如列表名称)来做到这一点。

2 个答案:

答案 0 :(得分:5)

我不推荐它,但你可以这样做:lapply(myList, 'attr<-', which='myname', value='myStaticName')。旧式for循环可能是执行此任务的最清晰方式 - 或者在创建对象时在上游执行此分配。

for (i in seq_along(myList)) attr(myList[[i]], 'myname') <- 'myStaticName'

编辑:

正如@mnel在评论中指出的那样,setattr包中的data.table也是一个有效的选项,因为它是通过引用分配的。

编辑:@mnel - 不要将setattr与lapply一起使用。这是for循环更快的一种情况。

library(microbenchmark)
library(data.table)
myList <- as.list(1:10000)

`lapply.attr<-` <- 
    function() 
    lapply(myList, 'attr<-', which='myname', value='myStaticName')

`for.attr<-` <- 
    function() 
    for (i in seq_along(myList)) 
        attr(myList[[i]], 'myname') <- 'myStaticName'

lapply.setattr <- 
  function() 
  lapply(myList, setattr, name='myname', value='myStaticName')

for.setattr <- function() 
  for (i in seq_along(myList)) 
  setattr(myList[[i]], name = 'myname', value = 'myStaticName')

result <- microbenchmark(`lapply.attr<-`(), `for.attr<-`(), lapply.setattr(), for.setattr())
plot(result)

enter image description here

答案 1 :(得分:0)

基于此answer by Thierry我自己找到了解决方案。实际上我已经接近几次尝试,但没有返回关键的整个列表。

myList <- lapply(names(myList),function(X){
attr(myList[[X]],"myname") <- X
myList[[X]]
})

我的错误不是返回整个列表而只返回函数的第二行,即属性。因此我无法替换初始列表。

@Matthew Plourde:奇怪的是:你的基准测试在我的机器上看起来有些不同:RStudio,OS X,2.5 Ghz Intel Core i7,16GB RAM。 enter image description here