在dplyr包中以链接方式添加属性

时间:2014-09-04 10:15:12

标签: r attributes attr chaining dplyr

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

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

感谢您的回复。

3 个答案:

答案 0 :(得分:7)

你可以这样做:

R> tmp <- iris %>% `attr<-`("date", Sys.Date())

R> attr(tmp,"date")
[1] "2014-09-04"

这取决于调用:

的事实
attr(x, "foo") <- "bar"

相当于调用:

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

答案 1 :(得分:5)

您还可以考虑来自&#34; data.table&#34;:

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"

答案 2 :(得分:1)

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

library(dplyr)

iris <- 
  iris %>%
  structure( date=Sys.Date() )

attr(iris,"date")  # "2017-02-24"

当知道属性名称时,@ juba的解决方案似乎是最好的选择。