當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


R is 對象是來自類嗎?


R語言 is 位於 methods 包(package)。

說明

用於測試對象和類之間或兩個類之間的繼承關係的函數 (extends )。

用法

is(object, class2)

extends(class1, class2, maybe = TRUE, fullInfo = FALSE)

參數

object

任何R對象。

class1, class2

給出要檢查 is 關係的兩個類中的每一個的名稱的字符串,或者(更有效地)這些類的類定義對象。

fullInfo

在對 extends 的調用中,如果缺少 class2,則 fullInfo 是一個標誌,如果 TRUE 會導致返回類 SClassExtension 的對象列表,而不僅僅是類的名稱。在實踐中,隻有距離槽可能有用;請參閱“選擇超類”部分;

maybe

有條件繼承返回什麽。但這種關係很少使用,也不推薦,因此不需要這個論點。

選擇超類

selectSuperClasses(cl) 的調用會返回超類列表,類似於 extends(cl) 。附加參數將返回的類名限製為直接超類和/或非虛擬類。

無論哪種方式,使用結果進行編程,特別是使用 sapply ,都是有用的。

要查找具有更通用定義屬性的超類,可以使用 extends 在以一個類作為參數調用時返回的結果進行編程。默認情況下,調用返回一個字符向量,其中包括類本身及其所有超類的名稱。或者,如果使用 fullInfo = TRUE 調用 extends ,則返回值是一個命名列表,其名稱是前一個字符向量。與超類相對應的列表的元素是類 SClassExtension 的對象。在這些對象中的信息中,有一項可能有用:類之間的代數,由 "distance" 槽給出。

使用 extends 調用的結果進行編程,特別是使用 sapply ,可以選擇超類。編程技術是定義一個測試函數,該函數為遵守某些要求的超類或關係返回TRUE。例如,要僅查找 next-to-direct 超類,請將此函數與擴展對象列表一起使用:

function(what) is(what, "SClassExtension") && what@distance == 2

或者,要僅查找 "myPkg" 中的超類,請將此函數與簡單的名稱向量結合使用:

function(what) getClassDef(what)@package == "myPkg"

將此類函數作為參數提供給在 extends 的輸出上調用的 sapply,可以讓您找到具有所需屬性的超類。請參閱下麵的示例。

請注意,使用擴展對象的函數必須測試其參數的類,因為不幸的是,為此目的, extends 返回的列表包括 class1 本身,作為對象 TRUE

注意

之前R4.2.0 代碼使用了第一個元素class1class2,默默地,現在要求這些是長度為一的字符向量。

例子

## Not run: 
## this example can be run if package XRPython from CRAN is installed.
supers <- extends("PythonInterface")
## find all the superclasses from package XR
fromXR <- sapply(supers,
    function(what) getClassDef(what)@package == "XR")
## print them
supers[fromXR]

## find all the superclasses at distance 2
superRelations <- extends("PythonInterface", fullInfo = TRUE)
dist2 <- sapply(superRelations,
    function(what) is(what, "SClassExtension") && what@distance == 2)
## print them
names(superRelations)[dist2]


## End(Not run)

參考

Chambers, John M. (2016) Extending R, Chapman & Hall. (Chapters 9 and 10.)

也可以看看

雖然 inherits 是為 S3 類定義的,但它已被修改,以便返回的結果幾乎總是等於 is ,無論是對於 S4 還是非 S4 對象。由於它是用C實現的,所以速度要快一些。唯一的不等價性是由於使用 setIs 引起的,這種情況很少會遇到。

相關用法


注:本文由純淨天空篩選整理自R-devel大神的英文原創作品 Is an Object from a Class?。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。