或者说它更通用:如何在列表元素中添加多个属性?
我试图将属性设置为列表中的所有元素data.frames
。最后,我想将names(myList)
添加为内部每个data.frame
的变量属性。但我甚至无法获得所有列表元素的静态属性。
lapply(myList,attr,which="myname") <- "myStaticName"
这不起作用,因为lapply
无法与lapply<-
一起使用。如果我至少知道如何做到这一点,也许我可以弄清楚如何使用不同的属性(如列表名称)来做到这一点。
答案 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)
答案 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。