R为" Matrix"创建虚拟课程和NULL

时间:2015-03-26 20:22:00

标签: r s4

我对R S4课程来说很新。我试图定义一个允许NULL的虚拟类和Matrix包中的“Matrix”(http://cran.r-project.org/web/packages/Matrix/)。 我尝试使用“setClassUnion”和以下代码:

library(Matrix)
setClassUnion("MatrixOrNULL", c("Matrix", "NULL"))

我希望新的虚拟类“MatrixOrNULL”允许NULL和包“Matrix”中的所有实际类。但是,当我尝试检查实例是否为“MatrixOrNULL”时,我得到了一些奇怪的答案,如下所示:

# Define a Matrix, a data frame and a string
mt <- Matrix(matrix(1:6, 2, 3))
df <- data.frame(x=1:5, y=6:10)
st <- "abc"

# Check whether it is a MatrixOrNULL
is(NULL, "MatrixOrNULL")         #  TRUE
is(mt, "MatrixOrNULL")           #  TRUE
is(df, "MatrixOrNULL")           #  TRUE
is(st, "MatrixOrNULL")           #  TRUE

我认为“data.frame”和“character”变量不是“MatrixOrNULL”,但它返回“TRUE”me。 (实际上我尝试的一切都是“MatrixOrNULL”对象。)

有谁可以帮我弄清楚这个虚拟课的问题是什么?

1 个答案:

答案 0 :(得分:2)

Matrix对象的实际类(class(mt))似乎是'dgeMatrix'

所以这似乎做了你之后的事情: setClassUnion("MatrixOrNULL", c("dgeMatrix", "NULL"))

编辑:我现在意识到你想要包里的每一课。

不幸的是,这些对象之间似乎没有共享类。所以有几种方法:

1)您可以简单地检查Matrix包中的所有类,并在类联合中明确地引用它们:https://cran.r-project.org/web/packages/Matrix/Matrix.pdf

2)如果你想知道它是否来自Matrix包, 您可以随时检查attr(object,'package')是否等于&#39; Matrix&#39;。这看起来更像是你所追求的,因为从每个Matrix类继承听起来都会有冲突。