gpt4 book ai didi

r - 直接使用 @ 访问 S4 对象插槽是不好的做法吗?

转载 作者:行者123 更新时间:2023-12-03 12:27:43 29 4
gpt4 key购买 nike

这几乎是一个哲学问题:直接使用 @ 访问和/或设置 S4 对象的插槽是否不好? ?

我一直被告知这是不好的做法,用户应该使用“访问器”S4 方法,并且开发人员应该为他们的用户提供这些方法。但我想知道是否有人知道这背后的真正交易?

这是一个使用 sp 的示例包(但可以推广到任何 S4 类):

> library(sp)
> foo <- data.frame(x = runif(5), y = runif(5), bar = runif(5))
> coordinates(foo) <- ~x+y
> class(foo)
[1] "SpatialPointsDataFrame"
attr(,"package")
[1] "sp"

> str(foo)
Formal class 'SpatialPointsDataFrame' [package "sp"] with 5 slots
..@ data :'data.frame': 5 obs. of 1 variable:
.. ..$ bar: num [1:5] 0.621 0.273 0.446 0.174 0.278
..@ coords.nrs : int [1:2] 1 2
..@ coords : num [1:5, 1:2] 0.885 0.763 0.591 0.709 0.925 ...
.. ..- attr(*, "dimnames")=List of 2
.. .. ..$ : NULL
.. .. ..$ : chr [1:2] "x" "y"
..@ bbox : num [1:2, 1:2] 0.591 0.155 0.925 0.803
.. ..- attr(*, "dimnames")=List of 2
.. .. ..$ : chr [1:2] "x" "y"
.. .. ..$ : chr [1:2] "min" "max"
..@ proj4string:Formal class 'CRS' [package "sp"] with 1 slots
.. .. ..@ projargs: chr NA

> foo@data
bar
1 0.6213783
2 0.2725903
3 0.4458229
4 0.1743419
5 0.2779656
> foo@data <- data.frame(bar = letters[1:5], baz = runif(5))
> foo@data
bar baz
1 a 0.22877446
2 b 0.93206667
3 c 0.28169866
4 d 0.08616213
5 e 0.36713750

最佳答案

this question stackoverflow-er 询问他们为什么找不到 end插入 Bioconductor IRanges 对象;毕竟有start() , width() , 和 end()访问器和 startwidth插槽。答案是因为用户与类交互的方式与实现方式不同。在这种情况下,实现是由一个简单的观察驱动的,即当只有两个(哪两个?取决于开发人员!)就足够了时,存储三个值(开始、结束、宽度)是不节省空间的。其他 S4 对象和常见的 S3 实例(如 lm 返回的实例)中存在类似但更深层次的接口(interface)和实现之间差异的示例。 ,其中存储在类中的数据适用于后续计算,而不是为表示特定用户可能最感兴趣的数量而定制。如果您要访问该 lm,将不会有任何好处。实例并更改一个值,例如 coefficients元素。这种接口(interface)与实现的分离为开发人员提供了很大的自由度,可以提供合理且持续的用户体验,可能与其他类似的类共享,但以使编程有意义的方式实现(并更改实现)类。

我猜这并不能真正回答您的问题,但是开发人员不希望用户直接访问插槽,并且用户不应该期望直接访问插槽是与类交互的适当方式。

关于r - 直接使用 @ 访问 S4 对象插槽是不好的做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9900134/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com