【问题标题】:Setting attributes to objects with pipes使用管道为对象设置属性
【发布时间】:2020-06-25 18:28:53
【问题描述】:

我广泛使用属性我喜欢使用管道来设置它们。

我经常使用rlang::set_attrs,但从 rlang 0.3.0 开始,它已被弃用。

但是,对于这种弃用没有任何解释(在NEWS.md 上从未提及),而且这个函数的结构对我来说似乎真的无害:

> rlang::set_attrs
function (.x, ...) 
{
    warn_deprecated("`set_attrs()` is deprecated as of rlang 0.3.0")
    if (!is_copyable(.x)) {
        abort("`.x` is uncopyable: use `mut_attrs()` to change attributes in place")
    }
    set_attrs_impl(.x, ...)
}
<bytecode: 0x000001d759d6ecd8>
<environment: namespace:rlang>

> rlang:::set_attrs_impl
function (.x, ...) 
{
    attrs <- dots_list(...)
    if (identical(attrs, set_attrs_null)) {
        attributes(.x) <- NULL
    }
    else {
        attributes(.x) <- c(attributes(.x), attrs)
    }
    .x
}
<bytecode: 0x000001d75d8f2128>
<environment: namespace:rlang>

这似乎与将它们设置在另一行相同,attr()

我知道data.table::setattr,但它的行为并不完全相同,而且似乎不太适合管道。

最后,我应该避免使用rlang::set_attrs吗?如果是,我应该避免在具有相同目的的自定义函数中复制什么?

【问题讨论】:

  • magrittr::set_attr()magrittr::set_attributes() 怎么样?我不确定他们是否在他们的 rlang 同行之前就在那里(在这种情况下,这可能与弃用有关),但对于您的用例,它们看起来很合适

标签: r attributes pipe rlang


【解决方案1】:

这个答案可能并不满足所有人,但它是一些研究(用于透视)。

set_attrs 于 2018 年 9 月首次软性弃用,在 a859be5。如果您查看该提交,set_attrs 的所有用法都被内联替换为以下内容之一:

-  set_attrs(dict, class = class(x))
+  structure(dict, class = class(x))

-  x <- set_attrs(x, NULL)
-  x <- set_attrs(x, srcref = srcref)
+  attributes(x) <- NULL
+  x <- structure(x, srcref = srcref)

我认为 rlang 开发人员(甚至可能是编写该提交的 @lionel-henry)会根据基本原理进行权衡,但是......我怀疑该功能并没有增加大量便利(非常主观的,我承认)。


虽然不是很好,但内联替换可以使用`attr&lt;-`

library(dplyr)

mtcars %>%
  identical(rlang::set_attrs(mtcars, nm = "foo"))
# [1] FALSE

mtcars %>%
  `attr<-`(., "nm", "foo") %>%
  identical(rlang::set_attrs(mtcars, nm = "foo"))
# [1] TRUE

【讨论】:

  • @lionel-henry,你对这个话题有什么见解吗?我的意思并不是在这方面听起来知识渊博或权威。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-25
  • 2010-10-11
  • 2023-03-26
相关资源
最近更新 更多