gpt4 book ai didi

r - 使用 R 属性有什么危险?

转载 作者:行者123 更新时间:2023-12-03 23:45:12 26 4
gpt4 key购买 nike

向 R 对象添加使用定义的属性可以很容易地携带一些与感兴趣的对象粘合在一起的附加信息。问题是它略微改变了 R 看待对象的方式,例如带有附加属性的数字向量仍然是 numeric但不是 vector不再:

x <- rnorm(100)
class(x)
## [1] "numeric"
is.numeric(x)
## [1] TRUE
is.vector(x)
## [1] TRUE
mode(x)
## [1] "numeric"
typeof(x)
## [1] "double"
attr(x, "foo") <- "this is my attribute"
class(x)
## [1] "numeric"
is.numeric(x)
## [1] TRUE
is.vector(x)
## [1] FALSE # <-- here!
mode(x)
## [1] "numeric"
typeof(x)
## [1] "double"

这会导致任何潜在的问题吗?我正在考虑的是向常见的 R 对象添加一些属性,然后将它们传递给其他方法。仅仅因为我向标准 R 对象(例如向量、矩阵、data.frame 等)添加了附加属性这一事实,有什么风险会破坏?

请注意,我不是要创建自己的类(class)。为了简单起见,我们还可以假设属性名称不会有任何冲突(例如,使用 dims 属性)。我们还假设,如果某些方法在某个时候会删除我的属性,这不是问题,这是可以接受的风险。

最佳答案

在我(有些有限的)经验中,向对象添加新属性并没有破坏任何东西。我能想到的唯一可能的情况是,如果一个函数要求一个对象具有一组特定的属性,而不是其他任何东西。我想不出我遇到过这种情况的时间。大多数函数,尤其是在 S3 方法中,只会忽略它们不需要的属性。

如果您删除属性,您更有可能看到出现问题。

您不会看到很多由附加属性引起的问题的原因是方法是在 class 上调度的。的一个对象。只要类没有改变,方法就会以几乎相同的方式分派(dispatch)。但是,这并不意味着现有方法将知道如何处理您的新属性。举个例子——在添加一个 new_attr 之后x 的属性和 y ,然后相加,结果采用x的属性. y 的属性发生了什么变化?默认 +函数不知道如何处理同名的冲突属性,所以它只使用第一个(更多细节在 R Language Definition,感谢 Brodie)。

x <- 1:10
y <- 10:1

attr(x, "new_attr") <- "yippy"
attr(y, "new_attr") <- "ki yay"

x + y

[1] 1 2 3 4 5 6 7 8 9 10
attr(,"new_attr")
[1] "yippy"

在另一个例子中,如果我们给出 xy具有不同名称的属性, x + y生成一个保留这两个属性的对象。
x <- 1:10
y <- 10:1

attr(x, "new_attr") <- "yippy"
attr(y, "another_attr") <- "ki yay"

x + y
[1] 11 11 11 11 11 11 11 11 11 11
attr(,"another_attr")
[1] "ki yay"
attr(,"new_attr")
[1] "yippy"

另一方面, mean(x)甚至不尝试保留属性。我不知道预测哪些函数将保留属性和不会保留属性的好方法。您可能可以在基本 R 中使用一些可靠的助记符(聚合与矢量化,也许?),但我认为应该考虑一个单独的原则。

如果保留新属性很重要,您应该定义一个新类来保留旧类的继承

使用新类,您可以编写扩展泛型的方法并以您想要的任何方式处理属性。您是否应该定义一个新类并编写它的方法在很大程度上取决于您添加的任何新属性对您将要做的 future 工作的值(value)。

所以一般来说,添加新属性不太可能破坏 R 中的任何内容。但是如果不添加新的类和方法来处理新属性,我会非常谨慎地解释这些属性的含义。职能。

关于r - 使用 R 属性有什么危险?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43369399/

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