gpt4 book ai didi

r - 为什么 names(x) 比 attr(x, "names") 好?

转载 作者:行者123 更新时间:2023-12-04 11:26:07 25 4
gpt4 key购买 nike

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

You should always get and set these attributes with their accessor functions: use names(x), class(x) and dim(x), not attr(x, "names"), attr(x, "class"), and 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()从那个角度看?

最佳答案

您不应该直接访问属性,因为代码的作者应该提供一个 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 ,但出于性能原因,我们更改了底层结构。但是,您可以看到公共(public) API 没有改变。

关于r - 为什么 names(x) 比 attr(x, "names") 好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21046953/

25 4 0