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

gun*_*ica 24 r

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

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

@Gavin Simpson随后评论说:

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

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

jor*_*ran 23

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

显然,这也归结为R Core.建议使用那些提取器函数,因为这样你就可以确保它总是返回正确的信息,即使函数作者发现有必要在引擎盖下改变它们.

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

  • 这是软件设计中的常见问题,并不以R的任何方式特定于R. (10认同)

Rei*_*son 16

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

mod <- glm(y ~ x1 + x2, data = foo, family = binomial)
mod$residuals
Run Code Online (Sandbox Code Playgroud)

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

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

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

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