如何解释 is() 的输出?

问题描述

当我通过单个变量调用 is 函数时,我得到以下信息。

> is(a)
[1] "integer"             "double"              "numeric"            
[4] "vector"              "data.frameRowLabels"

这些信息告诉我们什么?为什么我们有三个不同的属性,比如integer,double and numeric in [1],

这里的 data.frameRowLabel 是什么意思?

解决方法

在没有第二个参数的情况下调用 is(object,class2) 为我们提供了对象的 class(第一个元素)以及扩展(以下元素),

a <- 1:10

class(a)
# [1] "integer"

is(a)
# [1] "integer"             "double"              "numeric"            
# [4] "vector"              "data.frameRowLabels"

对应"integer"的类定义。

getClassDef("integer")
# Class "integer" [package "methods"]
# 
# No Slots,prototype of class "integer"
# 
# Extends: 
# Class "double",directly,with explicit coerce
# Class "numeric",directly
# Class "vector",directly
# Class "data.frameRowLabels",directly
# 
# Known Subclasses: 
# Class "factor",from data part
# Class "ordered",by class "factor",distance 2

检查 is(a) 的其他类的定义发现 "integer" 是它们的子类。

selectSuperClasses("integer")  ## don't know why `"double"` isn't listed there...!
# [1] "numeric"             "vector"              "data.frameRowLabels"

getClassDef("data.frameRowLabels")
# Extended class definition ( "ClassUnionRepresentation" )
# Virtual Class "data.frameRowLabels" [package "methods"]
# 
# No Slots,prototype of class "character"
# 
# Known Subclasses: 
# Class "character",directly
# Class "integer",directly
# Class "signature",by class "character",distance 2
# Class "className",distance 2
# Class "ObjectsWithPackage",distance 2
# Class "factor",by class "integer",distance 2
# Class "ordered",distance 3

## also try:
getClassDef("numeric")
getClassDef("vector")
getClassDef("double")  ## lists `"integer"` as subclass

我们可以检查一个对象是否扩展到一个特定的类。

is(a,"integer")
# [1] TRUE

is(a,"Date")
# [1] FALSE

## compare    
is(Sys.Date(),"Date")
# [1] TRUE

扩展和模式是不同的东西:

is(a,"double")
# [1] TRUE

## but
is.double(a)  ## tests the mode not the class resp. extend!
# [1] FALSE

为了测试对象和类之间的继承关系,我们可以使用extends(class1,class2,maybe = TRUE,fullInfo = FALSE)

extends("integer","double")
# [1] TRUE

test1 <- c("integer","double","numeric","vector","data.frameRowLabels","character","factor","foo")
mapply(function(x,y) extends(y,x),test,"integer")
#             integer              double             numeric              vector 
#                TRUE                TRUE                TRUE                TRUE 
# data.frameRowLabels           character              factor                 foo 
#                TRUE               FALSE               FALSE               FALSE

没有第二个参数,我们得到所有的扩展:

extends("integer")
# [1] "integer"             "double"              "numeric"            
# [4] "vector"              "data.frameRowLabels"

使用 fullInfo=TRUE 给出所有 is 关系的完整定义。有关详细信息,请参阅 SClassExtension-class

ex <- extends("integer",fullInfo=TRUE)
str(ex)
# List of 5
# $ double             :Formal class 'SClassExtension' [package "methods"] with 10 slots
# .. ..@ subClass  : chr "integer"
# .. .. ..- attr(*,"package")= chr "methods"
# .. ..@ superClass: chr "double"
# .. .. ..- attr(*,"package")= chr "methods"
# .. ..@ package   : chr "methods"
# .. ..@ coerce    :function (from,strict = TRUE)  
#   .. ..@ test      :function (object)  
#     .. ..@ replace   :function (from,to,value)  
#       .. ..@ simple    : logi FALSE
# .. ..@ by        : chr(0) 
# .. ..@ dataPart  : logi FALSE
# .. ..@ distance  : num 1
# $ numeric            :Formal class 'SClassExtension' [package "methods"] with 10 slots
# .. ..@ subClass  : chr "integer"
# .. .. ..- attr(*,"package")= chr "methods"
# .. ..@ superClass: chr "numeric"
# .. .. ..- attr(*,value)  
#       .. ..@ simple    : logi TRUE
# .. ..@ by        : chr(0) 
# .. ..@ dataPart  : logi FALSE
# .. ..@ distance  : num 1
# $ vector             :Formal class 'SClassExtension' [package "methods"] with 10 slots
# .. ..@ subClass  : chr "integer"
# .. .. ..- attr(*,"package")= chr "methods"
# .. ..@ superClass: chr "vector"
# .. .. ..- attr(*,value)  
#       .. ..@ simple    : logi TRUE
# .. ..@ by        : chr(0) 
# .. ..@ dataPart  : logi FALSE
# .. ..@ distance  : num 1
# $ data.frameRowLabels:Formal class 'SClassExtension' [package "methods"] with 10 slots
# .. ..@ subClass  : chr "integer"
# .. .. ..- attr(*,"package")= chr "methods"
# .. ..@ superClass: chr "data.frameRowLabels"
# .. .. ..- attr(*,value)  
#       .. ..@ simple    : logi TRUE
# .. ..@ by        : chr(0) 
# .. ..@ dataPart  : logi FALSE
# .. ..@ distance  : num 1
# $ integer            : logi TRUE

有关 "data.frameRowLabels" 类的更多信息可以在 documentation for package ‘methods’ 中找到。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...