我正在阅读有关数据结构和属性的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()
之间是否存在差异?
答案 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没有改变。