3

或者更笼统地说:如何向列表的元素添加多个属性?

我一直试图为列表的元素设置属性,所有这些元素都是data.frames. 最后,我想为每个内部添加names(myList)一个可变属性。data.frame但我什至无法获得所有列表元素的静态属性。

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

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

4

2 回答 2

5

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

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

编辑:

正如@mnel 在评论中指出的那样,setattrdata.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)

在此处输入图像描述

于 2012-11-28T21:21:26.433 回答
1

根据蒂埃里的这个回答,我自己找到了一个解决方案。实际上,我已经尝试了几次,但没有返回关键的整个列表。

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。 在此处输入图像描述

于 2012-11-28T21:29:30.087 回答