是和继承有啥区别?
Posted
技术标签:
【中文标题】是和继承有啥区别?【英文标题】:What's the difference between is and inherits?是和继承有什么区别? 【发布时间】:2015-03-11 11:31:07 【问题描述】:如果我想检查一个变量是否继承自某个类,我可以使用is
或inherits
。
class(letters)
## [1] "character"
is(letters, "character")
## [1] TRUE
inherits(letters, "character")
## [1] TRUE
我应该使用哪个偏好,它们是否会返回不同的值?
【问题讨论】:
@Richie 正如您提出并回答了这个问题,您能否将"character" %in% class(letters)
包含在您的问题/答案中?我对这篇文章的理解是它相当于继承,只是速度较慢,但我不确定。
@Moody_Mudskipper 是的,这也可以,虽然代码的意图不太清楚,所以我不确定你什么时候想要使用它。
我在这个答案中使用了它,例如:***.com/questions/18746456/simplified-dput-in-r。 is.list(iris)
是 TRUE
但 "list" %in% class(iris)
和 inherits(iris,"list")
是 FALSE
,这对于区分 data.frames 和列表很有用。我是否应该明白,为了敲钉子,后两者确实是等价的,并且您在所有情况下都推荐inherits
?顺便说一句,你漂亮的数据营课程把我带到了这里。
【参考方案1】:
短版:
使用 inherits
,但要小心数字和 S4 类。
加长版:
来自is
帮助页面的“另请参阅”部分:
对于 S4 和非 S4,继承几乎总是等同于 is 对象,并且速度更快。不等价适用于 具有条件超类的类,具有非平凡的测试= 在关系中(不常见且不鼓励):对于这些,是测试 该关系但根据定义继承忽略条件 S4 对象的继承。
来自inherits
帮助页面的正式类部分:
形式类的继承类比是is。两个函数 行为一致,但有一个例外:S4 类可以有 条件继承,带有显式测试。在这种情况下,将 测试条件,但继承忽略所有条件超类。
所以他们大多返回相同的东西,但inherits
更快,所以在大多数情况下它应该是默认选择。 (正如 Konrad 所提到的,is
还要求加载 methods
包,这可能使其不适合对性能敏感的 Rscript
使用。)
如果您使用具有条件继承的 S4 类,值可能会有所不同,但这是not recommended(请参阅“方法选择和调度:详细信息”部分),这意味着它希望很少见。
这两个函数最明显的不同之处在于检查整数是否为数字。
class(1L)
## [1] "integer"
is.numeric(1L)
## [1] TRUE
is(1L, "numeric")
## [1] TRUE
inherits(1L, "numeric")
## [1] FALSE
【讨论】:
好的,你能解释一下为什么整数不“继承”,而浮点数可以: Rgames> class(1.4) [1] "numeric" Rgames> 是。 numeric(1.4) [1] TRUE Rgames> 继承(1.4,'numeric') [1] TRUE Rgames> is(1.4,'numeric') [1] TRUE 我认为这可能与数字对象仅具有 implicit 类的事实有关:来自?class
,If the object does not have a class attribute, it has an implicit class, ‘"matrix"’, ‘"array"’ or the result of ‘mode(x)’ (except that integer vectors have implicit class ‘"integer"’).
我可以想象(??)@ 987654333@ 会查看隐式类,而 inherits
不会...?
我记得无意中听到高 R 受试者的评论称这是“不公平”。
另一个非常关键的区别是is
在包methods
中,运行Rscript
时默认不加载(因为加载速度很慢)。相比之下,inherits
来自 base
,因此很容易在 R 脚本程序中使用。以上是关于是和继承有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章