如果我想检查一个变量是否继承自某个类,我可以使用is
或inherits
。
class(letters)
## [1] "character"
is(letters, "character")
## [1] TRUE
inherits(letters, "character")
## [1] TRUE
我是否应该选择使用哪一种,是否会返回不同的值?
答案 0 :(得分:13)
简短版本:
使用inherits
,但要注意数字和S4类。
更长的版本:
从is
帮助页面的另请参阅部分:
对于S4和非S4,继承几乎总是等同于 对象,并且有点快。不等同适用于 具有条件超类的类,具有非平凡的测试= 在这种关系中(不常见和不鼓励):对于这些,是为了测试 关系,但按定义继承忽略条件 继承S4对象。
从inherits
帮助页面的正式课程部分:
正式类的继承类似物是。这两个功能 行为一致有一个例外:S4类可以有 条件继承,带有显式测试。在这种情况下,是的 测试条件,但是inherits忽略所有条件超类。
所以他们大多返回相同的东西,但是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