【问题标题】:How can I use attr<- with lapply?如何将 attr<- 与 lapply 一起使用?
【发布时间】:2012-11-16 20:30:43
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: r attributes lapply


    【解决方案1】:

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

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

    编辑:

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

    编辑:@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,喜欢您的编辑,谢谢。比我还快。你为什么不推荐它?仅仅因为它没有性能问题而且更透明?
    • @hans0l0 是的,我不认为对lapply 的调用的结果乍一看并不明显。我想这取决于谁在维护您的代码。在 R 中编写混淆代码非常容易。我认为额外的输入有时值得清晰。
    • 您也可以使用data.tablebit 包中的setattr,它将通过引用设置属性,因此基本上是即时的。
    • @mnel 谢谢,我忘了那个。
    • structure 是就地修饰符 attr&lt;- 的副本等价物
    【解决方案2】:

    基于这个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。

    【讨论】:

      猜你喜欢
      • 2011-10-23
      • 2019-11-21
      • 2021-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多