2

我刚刚开始学习 R 并对属性传播感到好奇。

我想用自定义值注释一个向量(我假设属性是这样做的正确方法?),我已经能够很容易地做到这一点。(如果这是一个 XY 问题,请提供背景)

当我开始操纵这些向量时,问题就开始了——我希望这些自定义注释能够传播,或者至少有一套明确定义的注释传播/丢失规则

我已经对此进行了一些研究,包括其他 SO question,它特别解决了子集功能,但我想进一步概括它:

  1. 不传播值的函数的完整列表是什么,或者
  2. 我怎么知道这个?
  3. 有没有更好的方法来完成我正在做的事情?

目标是应用这些注释,在数据上调用任意(尽可能多的)R 函数,并确保属性得到维护。数据框在这里也特别重要。

谢谢

4

2 回答 2

2

我认为您需要采用将“自定义值”放入数据列而不是使用属性的做法。将此称为 XY 问题并不是很具体,但它暗示了您拥有位置、数字数据并且希望按行注册字符数据的概念。这正是数据帧旨在支持的内容。

仅仅包裹c()一个向量就足以剥离它的属性,所以类和属性是相当脆弱的。数据框是一个列表,所以这个建议实际上与弗洛德尔的建议并不矛盾。

于 2013-10-17T00:36:51.387 回答
0

即使是简单的加法也会破坏属性。在下一个示例中,仅y保留 的属性:

x <- 1:5
attr(x, "foo") <- letters[1:3]

y <- 6:10
attr(x, "foo") <- letters[4:6]

x + y
## [1]  7  9 11 13 15
## attr(,"foo")
## [1] "d" "e" "f"

正如 DWin 所说,它们很脆弱。对于你想要的东西来说可能太脆弱了。


为了扩展弗洛德尔的观点,一种可以稳健传播所有内容的常用方法是使用具有类属性的列表。

返回的模型lm就是一个典型的例子。输出太大,无法在此处显示,但如果您对一个lm对象执行 unclass,您会看到它只是一个列表。

model <- lm(Sepal.Length ~ Sepal.Width + Species, iris)
unclass(model)

然后你可以重载任何函数(现在是 S3 方法)来处理你的新类。

于 2013-10-17T10:00:25.033 回答