【问题标题】:Adding attributes in chaining way in dplyr package在 dplyr 包中以链接方式添加属性
【发布时间】:2014-10-29 01:09:49
【问题描述】:

有没有办法使用来自dplyr 包的链式序列代码运算符%>% 添加属性?

> library(dplyr)
> iris %>%
+   attr( "date") = Sys.Date()
Error in iris %>% attr("date") = Sys.Date() : 
  could not find function "%>%<-"
> 

感谢您的回复。

【问题讨论】:

    标签: r attributes attr chaining dplyr


    【解决方案1】:

    如果属性名已知,最简单的解决方案是使用structure函数:

    library(dplyr)
    
    iris <- 
      iris %>%
      structure( date=Sys.Date() )
    
    attr(iris,"date")  # "2017-02-24"
    

    在不知道属性名的情况下,@juba 的解决方案似乎是最好的选择。

    【讨论】:

      【解决方案2】:

      你也可以考虑来自“data.table”的setattr

      library(dplyr)
      library(data.table)
      names(attributes(iris))
      # [1] "names"     "row.names" "class" 
      
      iris %>% setattr(., "date", Sys.Date())
      names(attributes(iris))
      # [1] "names"     "row.names" "class"     "date" 
      attributes(I2)$date
      # [1] "2014-09-04"
      

      当然,这样的事情实际上不需要链接。你可以这样做:

      setattr(iris, "date", Sys.Date())
      

      这允许您在不复制相关对象的情况下设置属性:

      > v1 <- 1:4
      > v2 <- 1:4
      > tracemem(v1)
      [1] "<0x0000000011cffa38>"
      > attr(v1, "foo") <- "bar"
      tracemem[0x0000000011cffa38 -> 0x0000000011d740f8]: 
      > tracemem(v2)
      [1] "<0x0000000011db2da0>"
      > setattr(v2, "foo", "bar")
      > attributes(v2)
      $foo
      [1] "bar"
      

      【讨论】:

      • 谢谢。不错的解决方案,而且不那么陈旧。
      • 使用structure(作为基础包的一部分)完成同样的事情,而不依赖于data.table。请参阅下面的答案:stackoverflow.com/a/42443024/1504321
      【解决方案3】:

      你可以这样做:

      R> tmp <- iris %>% `attr<-`("date", Sys.Date())
      
      R> attr(tmp,"date")
      [1] "2014-09-04"
      

      这取决于调用:

      attr(x, "foo") <- "bar"
      

      相当于调用:

      x <- `attr<-`(x, "foo", "bar")
      

      【讨论】:

      • 太棒了!非常感谢您。这让我大开眼界。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-08
      • 2011-06-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多