是否有理由更喜欢提取器函数来访问带有$的属性?

时间:2013-07-24 02:58:03

标签: r

在CrossValidated的thread上,我发表了以下评论:

  

我怀疑这实际上是关于两者之间差异的R问题   使用S3课程(可通过$访问)& S4个类(那个   可以通过@)...

访问

@Gavin Simpson随后评论说:

  

@gung很可能会出现,但解决方案可能   深入研究物体并撕掉你的感受,但要学习使用   提取器函数,在本例中为coefficients()或其较短的别名   coef()coef(fit)

我对此很感兴趣。 为什么使用 coef(model) 优于 model$coefficients[,1] ,例如?(我认识到后者更加丑陋需要稍微多一点的打字,但我怀疑这是原因。)如果没有现有的提取器功能(例如,访问t统计数据)怎么办?

2 个答案:

答案 0 :(得分:22)

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

显然,这也归功于R Core。建议使用那些提取器函数,因为这样你就可以确定它将始终返回正确的信息,即使函数作者发现有必要在引擎盖下随机移动。

也许他们会向模型列表对象的其中一个元素添加更多信息,这会改变一切的顺序?您的所有代码都将中断。

答案 1 :(得分:16)

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

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

?? (如果你不知道的话,将鼠标悬停在下方以获得答案!)

  

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

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

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