【问题标题】: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"
【解决方案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")