我如何使用attr < - 与lapply?

Mat*_*ert 3 attributes r lapply

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

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

lapply(myList,attr,which="myname") <- "myStaticName"
Run Code Online (Sandbox Code Playgroud)

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

Mat*_*rde 5

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

for (i in seq_along(myList)) attr(myList[[i]], 'myname') <- 'myStaticName'
Run Code Online (Sandbox Code Playgroud)

编辑:

正如@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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 不要在setattr中使用`lapply` - 请参阅我的编辑. (3认同)