和遗传有什么区别?

Ric*_*ton 19 inheritance r r-faq

如果我想检查变量是否继承自某个类,我可以使用isinherits.

class(letters)
## [1] "character"
is(letters, "character")
## [1] TRUE
inherits(letters, "character")
## [1] TRUE
Run Code Online (Sandbox Code Playgroud)

我是否应该选择使用哪一种,并且它们是否会返回不同的值?

Ric*_*ton 13

精简版:

使用inherits,但要注意数字和S4类.


更长的版本:

is帮助页面的"另请参阅"部分:

继承几乎总是等同于S4,对于S4和非S4对象,并且有点快.非等价适用于具有条件超类的类,在关系中具有非平凡的测试=(不常见且不鼓励):对于这些,是对关系的测试,但是通过定义继承忽略S4对象的条件继承.

inherits帮助页面的"正式类"部分:

正式类的继承类似物是.这两个函数的行为一致,但有一个例外:S4类可以具有条件继承,并具有显式测试.在这种情况下,将测试条件,但继承忽略所有条件超类.

所以他们大多返回相同的东西,但inherits速度更快,因此在大多数情况下它应该是默认选择.(如Konrad所述,is还要求methods加载包,这可能使其不适合性能敏感的用途Rscript.)

如果您使用带有条件继承的S4类,则值可能不同,但不建议这样做(请参阅"方法选择和调度:详细信息"部分),这意味着它很少见.

两个函数不同的最明显的地方是检查整数是否为数字.

class(1L)
## [1] "integer"
is.numeric(1L)
## [1] TRUE
is(1L, "numeric")
## [1] TRUE
inherits(1L, "numeric")
## [1] FALSE
Run Code Online (Sandbox Code Playgroud)

  • 另一个非常关键的区别是`is`在包``methods`中,默认情况下在运行`Rscript`时没有加载(因为加载速度慢).相反,`inherits`来自`base`,因此在R脚本程序中很容易获得. (3认同)
  • 我认为这可能与数字对象只有*隐式*类这一事实有关:来自`?class`,`如果对象没有类属性,它有一个隐式类,'"矩阵"',' "array"'或'mode(x)'的结果(除了整数向量有隐式类'"integer"').我可以想象(?)````看隐式类和`继承`不做不......? (2认同)