证明S4对象是否相同

时间:2013-09-03 11:34:52

标签: r s4

我有两个包含S4个对象的列表。现在我想问一下list_1的元素是否包含list_2的元素,就像我在下面的例子中为字符向量列表所做的那样。

s<-list(a=LETTERS[1:3],b=LETTERS[4:6])
t<-list(n=LETTERS[1:3],v=LETTERS[1:4])
s %in% t

但它是否证明对象是否相同?如果没有,如何在不使用循环的情况下选择list_2中存在的list_1元素?

3 个答案:

答案 0 :(得分:4)

如果你想比较S4对象,我相信你必须使用(如Ben Bolker所建议的)混合函数slotNamesslotsapply

setClass("MyClass",representation(Slot1="vector",Slot2="vector"))
x <- new("MyClass")
x@Slot1 <- 1:4
x@Slot2 <- LETTERS[1:4]
y <- new("MyClass")
y@Slot1 <- 1:4
y@Slot2 <- LETTERS[4:6]

id <- function(a,b){
        sapply(slotNames(a),function(x)identical(slot(a,x),slot(b,x)))
        }

id(x,y)
Slot1 Slot2 
 TRUE FALSE 

现在,如果您想将其扩展到S4对象列表,请使用该Metrics解决方案:

X <- new("MyClass")
X@Slot1 <- 1:5
X@Slot2 <- LETTERS[1:4]
Y <- new("MyClass")
Y@Slot1 <- 1:4
Y@Slot2 <- letters[1:4]

a <- list(l1 = x, l2 = X)
b <- list(l1 = y, l2 = Y)

Map(id, a, b)
$l1
Slot1 Slot2 
 TRUE FALSE 

$l2
Slot1 Slot2 
FALSE FALSE 

答案 1 :(得分:2)

您可以使用Map

Map(function (x,y) x %in% y, s, t)
$a
[1] TRUE TRUE TRUE

$b
[1]  TRUE FALSE FALSE

或者,正如@plannapus所建议的那样,只需使用:

Map(`%in%`,s,t) 

答案 2 :(得分:-2)

现在我定义了一个运算符,我是否以正确的方式执行此操作?

"%inS4%" <- function(a,b) sapply(a,function(x) any(unlist(Map(identical,list(x),b))))
setClass(Class = "MyClass",
         representation = representation(name = "character",
                                         type = "character"
         )
)

a<-list(new("MyClass",name="abc",type="abc"),new("MyClass",name="abc",type="123"))
b<-list(new("MyClass",name="abc",type="123"),new("MyClass",name="abc",type="123"))

a %inS4% b