5

オブジェクトがS4クラスのインスタンスであるかどうかをテストするにはどうすればよいですか(これが正しい用語であるかどうかはわかりません)。関数については知っていますisS4が、これはクラス定義などにも当てはまります。例:

traj <- setClass(
  Class="Trajectories",
  representation=representation(
    times = "numeric",
    traj = "matrix"
  )
)

trajclass <- getClass("Trajectories")
trajobject <- new(Class="Trajectories",times=c(1,3),traj=matrix(1:4,ncol=2))

isS4(traj)
isS4(trajclass)
isS4(trajobject)

trajobjectこの場合、データを含むオブジェクトにのみ関心があります。メソッドやクラス定義ではそれほど多くはありません。S4オブジェクトが実際のオブジェクトであるかどうかをテストするために使用できるネイティブ関数はありますか?つまり、出力を使用print(object)する場合は次のように始まります。

クラス「foo」のオブジェクト....。

4

1 に答える 1

3

S4クラス(および参照クラス、さらに言えば、おそらく一部の人の悔しさ)は、S4クラスを使用して定義されます(クール(?)え?)

> class(trajclass)
[1] "classRepresentation"
attr(,"package")
[1] "methods"
> getClass(class(trajclass))
Class "classRepresentation" [package "methods"]

Slots:

Name:             slots         contains          virtual        prototype
Class:             list             list          logical              ANY

Name:          validity           access        className          package
Class: OptionalFunction             list        character        character

Name:        subclasses       versionKey           sealed
Class:             list      externalptr          logical

Known Subclasses: "ClassUnionRepresentation", "refClassRepresentation"

私はあなたができる最善のことは

isS4(trajclass) && !is(trajclass, "classRepresentation")

S4は、 ;showの同義語(一種)として使用します。printそのためのS4showメソッドclassRepresentationがあります

> selectMethod(show, class(traj))
Method Definition:

function (object) 
{
    cat(gettextf("Class generator function for class \"%s\" from package \"%s\"\n", 
        object@className, object@package))
    show(as(object, "function"))
}
<bytecode: 0x1522d40>
<environment: 0xf1d808>

Signatures:
        object                  
target  "classGeneratorFunction"
defined "classGeneratorFunction"

一方、のshowメソッドtrajobjectはデフォルトであり、

> selectMethod(show, class(trajobject))
Method Definition (Class "derivedDefaultMethod"):

function (object) 
showDefault(object, FALSE)
<bytecode: 0x1516d08>
<environment: namespace:methods>

Signatures:
        object        
target  "Trajectories"
defined "ANY"         

で肉とmethods::showDefault。私はあなたが実装できると思います

setGeneric("isNotS4ClassDef",
    function(object) standardGeneric("isNotS4ClassDef"))

setMethod(isNotS4ClassDef, "ANY",
    function(object) TRUE)

setMethod(isNotS4ClassDef, "classRepresentation",
    function(object) FALSE)
于 2012-06-02T00:31:01.630 に答える