在列表

时间:2016-02-16 15:03:01

标签: r list find exists s4

我有一个包含S4对象的列表。我需要检查该列表中是否存在一个S4对象。我尝试了本页中的一些替代方案但没有成功:

我尝试使用exists:

exists(foo,where=my_list)

Error in list2env(list(<S4 object of class "Atributo">, <S4 object of class "Atributo">,  
;names(x) must be a character vector of the same length as x

匹配:

match(foo, my_list)

'match' requires vector arguments

match的二元运算符在%:

中给出相同的结果%
foo %in% my_list

'match' requires vector arguments

is.element:

is.element(foo,my_list)

Error in match(el, set, 0L) : 'match' requires vector arguments

例如,我创建了5个元素,并且只创建了3个元素。我需要知道列表中是否有一个特定元素:

setClass("foo", representation = representation(bar = "numeric"))

one <- new("foo", bar = 12)
two <- new("foo", bar = 13)
three <- new("foo", bar = 14)
four <- new("foo", bar = 15)
five <- new("foo", bar = 16)

mylist <- list(one,two,three)

我想检查列表中是否存在特定元素,例如:

usefull_function(four,my_list)

FALSE

usefull_function(two,my_list)

TRUE

我知道如果它们是S4元素,我可以检查环境列表中是否存在环境。 ¿如何以优雅/快速的方式做到这一点?

谢谢。

2 个答案:

答案 0 :(得分:1)

sapplyanyis的组合应该有用。

setClass("foo", representation = representation(bar = "numeric"))

baz <- new("foo", bar = 42)
mylist <- list("hello", baz, 13)


any(sapply(mylist, is, class2 = "foo"))

关于列表中的对象名称,我只能想到两种方式

在构建列表时添加名称

mylist <- list(one=one,two=two,three=three)
"one" %in% names(mylist)

比较对象元素

mylist <- list(one,two,three)
any(sapply(mylist, function(x) identical(one, x)))
[1] TRUE

any(sapply(mylist, function(x) identical(four, x)))
[1] FALSE

注意 - 第二种方法假设对象中的元素是不同的,所以最好使用第一种方法。

答案 1 :(得分:0)

我只是遇到了同样的问题,但我认为您应该修改s4类定义 来自

setClass("foo", representation = representation(bar = "numeric"))

setClass("foo", representation = representation(name='character',bar = "numeric"))

然后

one <- new("foo",name='one', bar = 12)
two <- new("foo", name='two', bar = 13)
three <- new("foo",name='three', bar = 14)
four <- new("foo", name='four',bar = 15)
five <- new("foo", name='five',bar = 16)

mylist <- list(one,two,three)

然后您可以设计函数以从对象中提取所有名称并比较其名称