为什么名称(x)优于attr(x,“名称”)?

时间:2014-01-10 14:33:45

标签: r

我正在阅读有关数据结构和属性的Advanced R主题。它说:

  

您应始终使用其访问者获取和设置这些属性   函数:使用名称(x),类(x)和dim(x),而不是attr(x,“names”),   attr(x,“class”)和attr(x,“dim”)。

这有什么理由?是否有意外行为的例子?或者这只是一个推荐?在一个微不足道的层面上,我认为没有任何区别:

v <- 1:2
names(v) <- 3:4
all(attr(v, "names") == names(v))
#[1] TRUE
attr(v, "names") <- 5:6
all(attr(v, "names") == names(v))
#[1] TRUE

我通过浏览the source尝试了更复杂的方法,即 do_names do_attributes 。我发现差异很大,因此names(x)不仅仅是attr(x, "names")的别名。我会说前者可能更快,但这是一个疯狂的猜测。

作为一个补充问题,从这个角度来看,names()class()dim()之间是否存在差异?

1 个答案:

答案 0 :(得分:7)

您不应该直接访问属性,因为代码的作者应该提供一个API供您用来访问它们。这使他们可以灵活地更改底层代码而无需更改API。

xts包提供了一个很好的例子:

> library(xts)
> x <- xts(1:3, as.POSIXct("2014-01-01")+0:2)
> index(x)
[1] "2014-01-01 00:00:00 CST" "2014-01-01 00:00:01 CST" "2014-01-01 00:00:02 CST"
> attr(x, "index")
[1] 1388556000 1388556001 1388556002
attr(,"tzone")
[1] ""
attr(,"tclass")
[1] "POSIXct" "POSIXt"

在过去的某个时刻,内部索引存储为POSIXct,但出于性能原因我们更改了基础结构。但是,您可以看到公共API没有改变。