25

在 CrossValidated 上的一个帖子上,我发表了以下评论:

S3我怀疑这实际上是一个关于使用类(通过访问$)和S4类(通过访问)之间的区别的 R 问题@......

@Gavin Simpson 随后评论道:

@gung 很可能会出现,但解决方案可能不是深入研究对象并撕掉你的感觉,而是学习使用提取器函数,在这种情况下coefficients()或更短的 alias coef(),如coef(fit)

我对此很感兴趣。 例如,为什么 using coef(model) 会比 更好 model$coefficients[,1] (我认识到后者更丑陋,需要更多的输入,但我怀疑这是预期的原因。)如果没有现有的提取器函数(例如,访问 t 统计量),该怎么办?

4

2 回答 2

26

因为那时你正在使用的包的作者可以随意更改模型对象的底层结构,而不必担心破坏每个人的代码。

显然,这也可以推广到 R Core。建议使用这些提取器函数,因为这样您就可以确保它始终返回正确的信息,即使函数作者发现有必要在后台进行洗牌。

也许他们向模型列表对象的元素之一添加了更多信息,从而改变了所有内容的顺序?您的所有代码都会中断。

于 2013-07-24T03:02:56.537 回答
16

另一个主要原因是你必须小心你得到的东西。例如,如果你这样做,你会得到什么

mod <- glm(y ~ x1 + x2, data = foo, family = binomial)
mod$residuals

?? (如果你不知道,请悬停在下面的答案!)

你会得到工作残差,这对很多人来说可能不是很有用

提取器函数知道这一点,并将返回有用的东西或允许使用提取所寻找组件的不同方面。

我总是告诉我教 R 的人,他们不应该使用$,或者@除非他们非常熟悉被访问的方法和对象,而且永远不会在生产代码中使用 - 如果你这样做,你只是在自找麻烦。

于 2013-07-24T03:13:30.773 回答